Configuração da rede: script ou não?

Olá a todos, depois de uma viagem pra SP, voltei descansado, pronto pra começar mais um semestre na faculdade. E vou começar por aqui também com um problema que me ocorreu agora pouco, no MSN, de um amigo meu, Josué Vidal.

O problema dele era relativamente simples. Preciso configurar a rede de várias máquinas. Modificar o DNS, por exemplo. Como fazer um script?

Como um administrador inteligente, aceitei a proposta de não fazer tudo na mão. O problema é: como fazer isso com scripts? Imediatamente, não existe solução com as poucas ferramentas do Windows Script Host (WSH). Com o WMI dá, mas já cansa só de pensar em qual classe isso ia ficar, e qual seria o método que eu ia poder utilizar. Isso sem contar no script que eu ia ter que montar, abrir um arquivo de texto, ler linha por linha e chamar a função que muda o DNS... é possível, mas ia tomar uns 5 minutos.

Quando se fala de configuração de rede, existe sempre uma saída mais fácil, que nem todo mundo lembra de usar. O Net Shell, ou netsh. É um comandinho simples que abre um shell (ou não, como vamos ver a seguir) pra configurar a rede da máquina. Basta digitar netsh em um console qualquer.

Pesquisando um pouco, você vai ver que, digitando nessa sequencia os comandos interface, ip, dns você pode ver e configurar o DNS de uma máquina. Pode também executar direto da linha de comando, digitando tudo de uma vez:

netsh interface ip set dns "Conexão local" static 200.176.2.10 primary

Ótimo, podemos colocar essa linha em um script, colocar no logon das máquinas e tá tudo pronto... certo? Não. Não só está errado como dá pra ficar melhor ainda. O problema está no fato que usuários comuns não podem alterar configurações de rede. A saída então é executar o comando remotamente*. O parâmetro -r do netsh serve exatamente para isso, veja:

netsh -r nome_do_computador interface ip set dns "Conexão local" static 200.176.2.10 primary

Pronto. Agora você pode criar seu script pra ler linha por linha de um arquivo texto e executar o comando acima para cada linha do arquivo. Se quiser, pode usar o Microsoft Powershell e resolver o problema de vez, com uma única linha:

cat lista.txt | foreach {netsh -r $_ interface ip set dns 'Conexão local' static 200.176.2.10 primary}

Agora sim, resolvido o problema.

Até a próxima!

* o WMI poderia resolver esse problema novamente. Bastaria criar um script que executa um comando remotamente... tem pronto no Technet ScriptCenter. Mas já que existe um parâmetro que serve para fazer a mesma coisa, porque não?

Categorias dessa postagem:

Comentários

Anônimo : Vinicuis Muito bom o tópico, eu quem estava com este problema e procurei o Vidal para tal, funcionou perfeitamente via bat, mas precisava também setar o DNS secundario, não encontrei este comando via DOS, pode nos ajudar?!

UA,

Caique [27/7/06 16:01 - link]

Vinicius Canto : Bom... ainda com o netsh eu resolvi seu problema. Fiz assim:

1) coloquei manualmente o DNS secundário

2) abri o netsh, naveguei até interface ip e digitei o comando dump. Ele mostra o que eu preciso fazer pra chegar na configuração atual

Aí eu achei essa linha...

add dns name="Conexão local" addr=10.1.1.1 index=2

onde 10.1.1.1 foi o dns que eu coloquei pra ser o secundário.

Agora é só usar o -r e tudo mais...

Enjoy! [27/7/06 21:37 - link]

Anônimo : Canto ... Obrigado!

Você mais uma vez gentilmente nos ajudando a resolver problemas que acontecem no dia-a-dia em nossa rede ... [6/8/06 19:33 - link]

Anônimo : O anônimo sou eu Bruno Leonardo !

=] [6/8/06 19:34 - link]

Unknown : Bom pessoal sei que o assunto aqui não é VbScript, mas para executar a tarefa acima citada eu uso ele, vejam o código abaixo.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colNetCards = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")

For Each objNetCard in colNetCards
arrDNSServers = Array("10.250.4.2", "10.1.100.30") ' nessa linha é definido os DNS's primarios e secundários.
objNetCard.SetDNSServerSearchOrder(arrDNSServers)
Next


Para quem não sabe usar VBS é só pegar essas linhas de código, colocar no bloco de notas e salvar com a extensão ".vbs".

Espero ter ajudado. [12/11/06 21:50 - link]

Anônimo : Senhores estou Tentando executar esta linha:
C:\>netsh -r srv_teste interface ip set address "Conexão local" static 128.0.130.85 255.255.0.0 128.0.130.251 1

Porem ele retorna:
AVISO: Não foi possível obter informações de host do computador: [srv_teste]
. Alguns comandos podem não estar disponíveis.
Acesso negado.

Gostarai de saber se na maquina remota tem que estar algum servico habilitado ou se estou errando no comando, por favor me ajudem, preciso disso comc erta urgencia, Obrigado [16/3/07 09:56 - link]

Vinicius Canto : Olá,

Vamos por partes:

1) verifique see não há nenhum firewall no meio do caminho bloqueando o tráfego do netsh. Você vai ter que descobrir também qual é a porta usada quando as mensagens são enviadas de um micro para outro.

2) Ajudamos sim, mas não há qualquer garantia de tempo de resposta ou coisa do gênero. Assim como nos fóruns da Microsoft e listas de discussão que participo, todo o trabalho é voluntário, ninguém recebe por isso, e ajudamos usando o tempo vago restante nas nossas agendas. Caso precise realmente de alguma dessas dicas com urgência, sugiro procurar suporte profissional (pago, of course). Você vai ter respostas imediatas pra problemas desse tipo. Não leve a mal, é só uma dica e um esclarecimento sobre como funcionam as comunidades em geral. =)

Vinicius [21/3/07 03:09 - link]

Anônimo : Vinicius

Preciso de uma ajuda. Tudo que voce escreveu aqui me ajudou bastante mas estou precisando de mais uma ajudinha. Como faço para apenas pegar o valor do dns que está configurado na placa e jogar em uma variavel? Entenda meu caso. Esse script de troca o dns está blz mas irei fazer isso em maquina distantes então preciso saber antes qual o dns que está na placa guardar esse valor e colocar no dns secundario. Ai eu iria colocar o script o que eu quero no primario e o que foi quardado no segundo. se Voce puder me ajudar [11/1/08 12:18 - link]

Michel L. Campi. : strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
strIPAddress = Array("192.168.9.251")
strSubnetMask = Array("255.255.255.0")
strGateway = Array("192.168.3.2")
strGatewayMetric = Array(1)
strDNSServers = Array("192.168.3.2", "192.168.0.2")

For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
errDNS = objNetAdapter.SetDNSServerSearchOrder(strDNSServers)


If errEnable = 0 Then
WScript.Echo "O endereco IP foi alterado com sucesso!"
Else
WScript.Echo "Ocorreu um erro! O endereco IP não foi alterado..."
End If

Next [17/3/08 21:30 - link]

Anônimo : Achei o post muito útil, então coloco um exemplo a ser gravado em um BAT:

@Echo off
echo.
echo Configurando para a REDE XXX com internet ADSL BRTurbo
echo.
echo Configurando a Rede...
netsh int ip set address name="Rede Local" source=static 192.168.1.155 255.255.255.0 192.168.1.101 1
echo Configurando DNS...
netsh int ip set dns "Rede Local" static 192.168.2.10 primary
netsh int ip add dns "Rede Local" addr=200.176.2.12 index=2
echo Rede Ok!
echo.
echo.
ipconfig /release
ipconfig /renew [24/4/08 21:33 - link]

Max W. : eu posso rodar o script sem especificar o nome da interface ou o script atribuir o IP para uma interface com qualquer nome?

Ex.: se eu criar esse script para um cliente que eu não sei o nome da interface de rede dele e para eu não ter que perguntar isso ao cliente, existe algum jeito de fazer o script rodar?:

Valew [27/5/08 18:06 - link]

Anônimo : Bom dia pessoal. Eu já vinha utilizando netsh em arquivos bat para alterar as configurações de rede (IP e DNS) de alguns usuários de laptops que hora utilizam o micro plugado na intranet da empresa, hora em casa, com rede banda larga tradicional.

Meu problema atual é que na intranet existe uma configuração de proxy que eu gostaria de desabilitar o proxy através do mesmo bat que configura a rede para IP e DNS dinâmicos. Alguém sabe como?

Muito obrigado!

Josmar Arruda
josmararruda@gmail.com [7/8/08 06:04 - link]

Unknown : Pessoal preciso mto de uma ajuda! Estou rodando o comando NETSH remoto mas não está aceitando!

AVISO: NÃO FOI POSSIVEL OBTER INFORMAÇÕES DE HOST DO COMPUTADOR: [TESTE]. ALGUNS COMANDOS PODEM NÃO ESTAR DISPONIVEIS.
ACESSO NEGADO

O SEGUINTE COMANDO NÃO FOI ENCONTRADO: INTERFACE IP SET DNS "rede local" STATIC 192.168.1.100 PRIMARY

Estou rodando o comando assim:
netsh -r teste interface ip set dns "rede local" static 192.168.1.100 primary

Na minha maquina funcina se eu tirar somente o "-r teste"!!!

Minha intenção é trocar o dns (e gateway também) automaticamente! tenha uma pagina em PHP, que fica monitorando meus gateways e se caso um cair, automaticamente qro que troque o gat. e dns do meu servidor, para o outro gateway??? vcs acham possivel isso?? alguem teria uma ideia melhor??? rs...

agradeço desde de já!

se alguem quiser essa pagina me manda por email! é mto bacana!

carlosgvrf@hotmail.com

abraços! [8/9/08 11:09 - link]

Anônimo : Olá, Vinicius. Há como usar o script vbs para configurar o IP e DNS para automáticos? [23/2/09 17:10 - link]

Eduardo : há um problema quando esse script é executado no vista, ele não tem permissão para executar. a msg que da é:a operação solicitada requer elevação. alguém sabe o q eu faço pra poder rodar no vista??? [19/4/09 22:35 - link]

Beirsdorf : o script:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
strIPAddress = Array("192.168.9.251")
strSubnetMask = Array("255.255.255.0")
strGateway = Array("192.168.3.2")
strGatewayMetric = Array(1)
strDNSServers = Array("192.168.3.2", "192.168.0.2")

For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
errDNS = objNetAdapter.SetDNSServerSearchOrder(strDNSServers)


If errEnable = 0 Then
WScript.Echo "O endereco IP foi alterado com sucesso!"
Else
WScript.Echo "Ocorreu um erro! O endereco IP não foi alterado..."
End If

Next


Funciona, porém quando seto o ip: 192.168.2.1, mascara: 192.168.254.254, gateway:192.168.2.1 e dns: 192.168.254.254 , ele simplesmente só configura o dns e não mais o ip, mascara e gateway, o que será que está acontecedo? [22/4/09 12:20 - link]

Beirsdorf : opa errei a mascar que eu queria dizer é 255.255.255.0 [22/4/09 15:54 - link]

HARDWARE, REDES & S.O : Rodrigo Tisatto

Bom esse .bat que vc deu exemplo não funciona quando o nome da conexão é: Conexão local

pelo visto o .bat não reconhece o circunflexo vc sabe como resolver esse problema?

pq vou fazer esse bat para uma pessoa executar na casa dele so que a mulher não sabe muito ai vai ser complicado pedir para ela renomear a conexão de rede. [13/5/09 18:58 - link]

Unknown : Rodrigo bom dia! nesse caso utilize um programa chamado MS DOS TXT... vc utiliza ele pra digitar palavras com "acentos" ex:"conexão"!

Com isso vc consegue criar um .BAT com os nomes acentuados! [14/5/09 10:51 - link]

Anônimo : Pessoal, estou criando um script vbs para fazer estas alterações. Meu caso é que tenho duas conexões de rede. Em BAT funciona perfeitamente, mas quando comecei a fazer em vbs percebi que todos usam a referencia de SELECT com a condição WHERE IPEnable=TRUE, mas isso seleciona todas as minhas conexões´, e é exatamente o que não pode acontecer, eu quero modificar apenas uma das conexões... estou quebrando a cabeça para encontrar uma forma de alterar apenas uma das condições... Se alguém tiver uma solução eu agradeço. [4/1/10 11:26 - link]

claudio : Bom Dia ! Vinicius

Gostaria de saber por que quando executo o comando para alterar um micro remoto , ele altera o dns do meu micro e não o do remoto.

obrigado [17/5/12 10:37 - link]