Ei, equipe de scripts!Sem dúvida, somos adaptáveis

A equipe de scripts da Microsoft

Esta coluna é baseada em uma versão de pré-lançamento do Windows Vista. Algumas informações deste artigo estão sujeitas a alterações.

Faça download do código deste artigo: ScriptingGuys2006_11.exe (151KB)

PROVAVELMENTE VOCÊ já ouviu falar que uma das melhores maneiras de avançar na carreira é associar-se, ou seja, fazer conexões com outras pessoas do setor para aprender com elas, compartilhar informações e talvez conseguir um novo emprego. A equipe de scripts nunca entendeu realmente essa coisa de rede de carreiras (o que deveria ser óbvio), mas nós sabemos uma ou duas coisas sobre redes de computadores. Isso acontece porque é possível fazer muita coisa com a rede por meio dos scripts.

O WMI (Instrumentação de gerenciamento do Windows®) oferece várias classes que você pode usar para controlar e monitorar seu ambiente de rede. Duas dessas classes, Win32_NetworkAdapter e Win32_NetworkAdapaterConfiguration, permitem que você trabalhe com - adivinhe? - adaptadores de rede em seus computadores.

Uma pergunta que sempre ouvimos é "Como eu ativo e desativo meus adaptadores de rede por meio de um script?" Bem, não vamos fazer suspense. Vamos lhe dizer logo que você não pode. Pelo menos não até executar o Windows Vista™. No Windows Vista foram adicionados dois novos métodos à classe Win32_NetworkAdapter: Enable e Disable. Vamos ver esses métodos em breve. Mas, em primeiro lugar, antes de você ficar muito desanimado, vamos mostrar algumas das coisas que você pode fazer com os sistemas operacionais anteriores ao Windows Vista. Só para os iniciantes: você pode descobrir quais são os adaptadores de rede que realmente estão disponíveis na máquina (consulte a Figura 1). Isso é bom, não é?

Figure 1 Como encontrar adaptadores de rede

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

Na Figura 1, começamos pela conexão aos serviços do WMI no computador local. Sem dúvida, é fácil encontrar os adaptadores de rede em seu computador local, usando a GUI, mas tente usá-la para obter informações sobre os adaptadores de rede de um computador remoto. Essa é uma das boas coisas deste script e do script WMI em geral: você pode executar o mesmo script para atuar em um computador remoto, basta alterar o valor de strComputer como o nome do computador remoto.

Após a conexão com o serviço WMI, consultamos a classe Win32_NetworkAdapter. Essa consulta retorna uma coleção de todos os adaptadores de rede do computador. A partir daí, tudo o que temos a fazer é configurar um loop For Each para percorrermos a coleção de adaptadores e repetir o Name e a Description de cada um deles. Sua saída ficará mais ou menos assim:

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

Há muitas outras informações que podem ser recuperadas sobre os adaptadores de sua rede apenas repetindo diferentes propriedades do Win32_NetworkAdapter, como DeviceID, Manufacturer e TimeOfLastReset. Para obter mais informações, consulte a magnum opus "Automação da rede TCP/IP em clientes", encontrado - onde mais? - no Script Center.

Adaptação à alteração

Com a classe Win32_NetworkAdapter, tudo que você pode fazer é recuperar informações sobre os adaptadores de rede. Se quiser realmente alterar as configurações do adaptador, você precisará usar a classe Win32_NetworkAdapterConfiguration. Essa classe não apenas fornece informações adicionais sobre seus adaptadores (graças às propriedades que não são encontradas em Win32_NetworkAdapter), mas também oferece vários métodos que permitem configurar os adaptadores de rede como você quiser.

Por exemplo, talvez você não possa ativar e desativar os adaptadores, mas pode ativar e desativar o DHCP (Protocolo de configuração dinâmica de hosts) em cada adaptador ativado para TCP/IP. A Figura 2 mostra um script que procura todos os adaptadores ativados para o TCP/IP, verifica se o DHCP está ativado em cada adaptador e, caso não esteja, o ativa.

Figure 2 Ativação do DHCP

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

Assim como o script da Figura 1, o script da Figura 2 conecta o serviço WMI no computador local. Em seguida, ele consulta a classe Win32_NetworkAdapterConfiguration. Como estamos interessados apenas naqueles adaptadores que são ativados para TCP/IP, incluímos uma cláusula Where em nossa consulta:

Where IPEnabled = 'True'

Essa cláusula especifica que só queremos as instâncias da classe Win32_NetworkAdapterConfiguration nas quais a propriedade IPEnabled é True. Isso significa que o adaptador associado àquela instância está ativado para TCP/IP.

A seguir, usamos um loop For Each para iterar através da coleção de adaptadores retornada para sua consulta. Dentro do loop, verificamos primeiro a propriedade DHCPEnabled de cada adaptador. Se a propriedade estiver definida como False, isso significa que o DHCP não está ativado e, portanto, queremos ativá-lo. Fazemos isso chamando o método EnableDHCP do objeto do adaptador. Não há nada mais a ser feito.

Apenas para facilitar a visualização do que está acontecendo no script, retornamos a propriedade Caption, para que saibamos com quais adaptadores estamos trabalhando. Incluímos também uma instrução Select Case e criamos descritores de cada resultado possível para o usuário final. O método EnableDHCP retorna um valor inteiro ao ser concluído. Um valor 0 significa que o método foi executado com êxito e que o DHCP está ativado. Um valor 1 significa que o método foi executado com êxito, mas o computador precisa ser reinicializado para que a alteração tenha efeito. Qualquer outro valor significa que algo saiu errado e que o DHCP não foi ativado. Usamos a instrução Select Case para verificar esses valores inteiros e retornar uma mensagem apropriada.

Também é possível desativar o DHCP. Isso é feito configurando um endereço IP estático e uma máscara de sub-rede no adaptador (consulte a Figura 3).

Figure 3 Configuração de um endereço IP

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

O script da Figura 3 é quase idêntico ao script da Figura 2, com apenas algumas diferenças. No início do script declaramos duas matrizes, arrIPAddress e arrSubnetMask, e atribuímos um valor a cada uma delas. Em seguida, em nosso loop For Each, em vez de verificar se DHCPEnabled é False, verificamos se ele é True. Isso significa que o DHCP está ativado (o que, por sua vez, significa que queremos desativá-lo). Em seguida, chamamos o método EnableStatic do objeto do adaptador. Você notará que, ao contrário do método EnableDHCP, o EnableStatic assume parâmetros. Esses parâmetros são as matrizes que declaramos anteriormente e que contêm o novo endereço IP estático e a máscara de sub-rede.

Adições ao Windows Vista

Conforme o prometido (como a equipe de scripts nunca, ou pelo menos muito raramente, deixa de cumprir suas promessas), agora mostraremos como isso é feito no Windows Vista. Como dissemos antes, no Windows Vista a classe WMI Win32_NetworkAdapter tem dois métodos novos, Enable e Disable, que permitem ativar e desativar seus adaptadores de rede. Há também uma nova propriedade, NetEnabled, que retorna True se o adaptador estiver ativado e False se ele não estiver ativado. A Figura 4 mostra um script que encontra todos os adaptadores de rede desativados do computador e, em seguida, os ativa.

Figure 4 Como ativar adaptadores de rede

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

Isso é quase idêntico ao script que mostramos para você na Figura 1. (Caso você ainda não tenha notado, somos fortes defensores da reutilização). Conectamo-nos ao serviço WMI no computador local e consultamos todas as instâncias do Win32_NetworkAdapter. Como estamos interessados apenas nos adaptadores que estão desativados, adicionamos uma cláusula Where:

Where NetEnabled = 'False'

Essa cláusula utiliza a nova propriedade NetEnabled para especificar que apenas os adaptadores nos quais NetEnabled está definida como False (em outras palavras, nos quais o adaptador de rede está desativado) devem ser retornados pela consulta. A seguir, configuramos novamente um loop For Each para passar pela coleção dos objetos de adaptadores de rede retornados da consulta. Após retornar o Name e Description do adaptador, chamamos o método Enable para ativar o adaptador.

Tudo é muito simples, certo? Agora só faltava entender aquele outro tipo de rede.

A equipe de scripts da MicrosoftA equipe de scripts trabalha para - ou é empregada pela - Microsoft. Quando não está jogando/treinando/assistindo beisebol (e diversas outras atividades), ela administra o TechNet Script Center. Verifique em www.scriptingguys.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..