Wake On Lan & Powershell: Acordando computadores na rede

Bom dia! continuando meu post anterior, tenho aqui a primeira versão de uma função que criei como demonstração de utilização daquele pequeno script que consegue enviar pacotes UDP via rede local. Trata-se de uma aplicação extremamente útil em ambientes corporativos, principalmente quando você tem boas informações sobre todas as máquinas. Existem diversas aplicações na Internet com implementações do WakeOnLan, várias gratuitas e em várias linguagens de programação, tecnologias, etc. Minha intenção aqui é só demonstrar como fazer isso usando somente o Powershell e o .Net Framework.

A linguagem do Powershell é bem parecida com C#, então estiver procurando como fazer um em C#, esse código pode ser facilmente adaptado. A principal vantagem do meu é a simplicidade e o fato de não precisar baixar nada da Internet pra fazer isso... você só precisa de um Bloco de Notas e de um Powershell!

A idéia do WakeOnLan é bem simples: primeiramente, o computador deve ser compatível com WOL (isso inclui ter PCI2.2, fonte ATX, placa de rede compatível, etc..). Isso pode ser normalmente identificado na BIOS do sistema, que deve conter uma opção que ativa/desativa WakeOnLan. Certifique-se de que a máquina que vai ser acordada está configurada corretamente.

Mas como isso funciona? O computador que pode ser acordado fica monitorando a placa de rede, procurando por um Magic Packet. Ao receber um, ela liga o computador. Esse Magic Packet nada mais é do que um pacote UDP enviado para o endereço de broadcast da rede, normalmente nas portas 7 ou 9, com FF FF FF FF FF FF nos 6 primeiros bytes e na sequência o endereço MAC da placa de rede repetido 16 vezes, totalizando 102 bytes. Há ainda a possibilidade de enviar também uma senha, mas isso não é muito utilizado e eu não implementei. Mais informações na Wikipédia.

Meu script é simples. Basta salvar em um arquivo .PS1 e chamar ele usando o que chamamos de dot-sourcing. É como executar um script, mas as funções (e também as variáveis, dados, constantes, aliases...) de dentro do script passam a valer também fora dele. A seguir, você chama a função wake-computer, que recebe dois parâmetros: o endereço MAC da placa e o endereço de broadcast.

Exemplo:

. '.\wake-computer.ps1'
wake-computer 00:16:76:75:01:00 192.168.1.255

E agora, segue o código:


# wake-computer function 
# by Vinicius Canto - MVP 
# 
# Usage: wake-computer 
# 
# : MAC address of remote machine. The mac-address must be in the 
# format AA:BB:CC:DD:EE:FF, six numbers in hexadecimal, like the 
# output of IPconfig command 
# 
# Address used to broadcast packets on local network. This 
# address must be in the format a.b.c.d, with a, b, c and d 
# numbers between 0 and 255, the common form of an IP Address 
# 
# Example: 
# wake-computer 00:16:76:75:AA:00 192.168.1.255 
# 
# For more information, contact-me: scripterbr (at) gmail (dot) com 
# 
# I'm looking for people to improve the code... if you want, contact me!  
# example line that sends an UDP packet 
# (new-object System.Net.Sockets.Socket(2,2,17)).SendTo("Vinicius",(new-object System.Net.IPEndPoint(([System.Net.IPAddress]::Parse("192.168.1.2")),2000))) 


function wake-computer([string]$macAddress, [string]$broadcastAddress) {
	$socket = new-object System.Net.Sockets.Socket(2,2,17)
	$destination = [System.Net.IPAddress]::Parse($broadcastAddress)
	$endpoint = new-object System.Net.IPEndpoint($destination,9) 
	[byte[]]$buffer = @(255,255,255,255,255,255) 
	$buffer += (($macAddress.split(':') | foreach {[byte]('0x' + $_)}) * 16)
	$sent = $socket.Sendto($buffer, $buffer.length, 0, $endpoint) 
	"$sent bytes sent. The computer $macAddress may be initializing."
}

Recomendo tomar cuidado com as quebras de linha. A configuração do Blogger não favorece código fonte... Além disso, verifique se a sua configuração atual do Powershell permite executar scripts com o comando Get-ExecutionPolicy. Sugiro também ficar de olho no blog do Wesley... ele anda estudando umas tecnologias novas como o IAMT (acho q era isso) e elas envolvem, dentre outras coisas, gerenciamento remoto de computadores. Já já ele inventa algo legal e posta lá. O link tá aqui ou aqui do lado nos links.

Até a próxima!

Categorias dessa postagem:

Comentários

Anônimo : Qual a possibilidade de ativar uma maquina da rede usando o prompt de comando? [18/8/07 17:33 - link]

Vinicius Canto : Desculpe, mas não entendi sua pergunta. Esse script É para linha de comando. Basta salvar o script e executar. A diferença é que, ao invés do Prompt de Comandos original do Windows, você deve instalar o Windows Powershell, que tem inúmeras vantagens.

Em todo caso, existem várias ferramentas para fazer a mesma coisa... eu só quis demonstrar como automatizar isso com o Powershell com um script simples. Uma dessas ferramentas é o mc-wol, que pode ser obtido gratuitamente.

Até mais, [19/8/07 11:16 - link]

Rosangela : Oi Vinicius.
Muito boa dica.
Preciso ligar computadores via wan?
Com o seu script é possível?
O que eu precisaria? [22/1/08 18:57 - link]

Vinícius : E ai Vinicius eu queria uma ajuda sua.
Nao tenho nenhuma experiencia em powershell, mas consegui criar meu script para fazer oque eu quero, so que nao sei como fazer ele ser executado automaticamente.
Queria criar um .bat para meu sqlserver executar ele juntamente com uma rotina de backup.
Como fazer esse .bat? Se eu fizer um .bat da forma normal ele será executado no msdos padrao e nao no powershell. [16/1/09 15:34 - link]

Vinícius : Esqueci de deixar meu e-mail.
vinasgo@gmail.com
Obrigado!!! [16/1/09 15:36 - link]

Club : Is it possible to translate this in English? [19/1/10 12:56 - link]

Vinicius Canto : Of course. I'll translate it this weekend.

Thank you!


Vinicius [22/1/10 18:26 - link]

Vinicius Canto : Here's the English version:

Wake On Lan & Powershell: Waking up computers in a network [23/1/10 23:42 - link]