Para quem não sabe, o PowerShell é o prompt de comandos vitaminado do Windows (acho que começou a aparecer já na instalação do Windows 7 em diante), que possibilita realizar uma série de operações que o cmd.exe padrão não permite.
Com o PowerShell podemos interagir diretamente com a API do Windows e acessar classes e métodos da plataforma .NET.
Nesta página vou adicionar alguns comandos úteis que for encontrado por ai. Vamos lá, então.
Ah, antes de começar, abra o PowerShell clicando em Iniciar->Executar e pesquisa por Windows PowerShell. Será aberta uma janela azul, com o prompt de comando mais ou menos nesse padrao: PS C:\>. A partir dai é só digitar os comandos. Funções básicas do cmd.exe (como dir, ipconfig, ren, etc) fucnionam normalmente.
Para retornar o conteúdo de uma página web (seu código html) podemos fazer o seguinte:
PS C:\> $webClient = New-Object Net.WebClient PS C:\> $str = $webClient.DownloadString('http://www.is5.com.br/ip.php') PS C:\> Write-Output $str
Este comando irá imprimir o seu endereço IP externo na tela, uma vez que chamamos a página www.is5.com.br/ip.php que faz exatamente isso: retorna uma string com o endereço IP do cliente. Isso é útil quando você quer saber o seu endereço na internet.
PS C:\> $client = New-Object System.Net.Sockets.TCPClient('127.0.0.1',80) PS C:\> Write-Output $client.Connected
Este se retornar True, a porta está aberta. Se retornar False ou der algum erro ao executar a primeira linha a porta está fechada.
Para ver os dados armazenados na variavel $client, basta dar um Write-Output direto nela ou digitar somente o nome da mesma:
PS C:\> $client Client : System.Net.Sockets.Socket Available : 4 Connected : True ExclusiveAddressUse : False ReceiveBufferSize : 8192 SendBufferSize : 8192 ReceiveTimeout : 0 SendTimeout : 0 LingerState : System.Net.Sockets.LingerOption NoDelay : False
PS C:\> $listener = [System.Net.Sockets.TcpListener]3281 PS C:\> $listener.start() PS C:\> $client = $listener.AcceptTcpClient()
Com este comando podemos abrir uma porta TCP qualquer, aqui utilizo como exemplo a porta 3281 (escolha uma porta qualquer q não esteja em uso, obviamente) e aguardamos a conexão de clientes.
Para testar se esta funcionando, abra um outro terminal (pode ser PowerShell ou cmd.exe mesmo), e tente conectar por Telnet ou utilizando o exemplo do item 2.
c:\> telnet localhost 3281
Somente abrir uma porta não é muito útil.
Mas, se abrirmos uma porta, aguardar conexão, dizer "bem vindo" quando o cliente se conectar e imprimir em tela tudo o que o cliente digitar do outro lado?
Dificil? Nem tanto! Viva o PowerShell :)
PS C:\> $listener = [System.Net.Sockets.TcpListener]3281 PS C:\> $listener.start() PS C:\> $client = $listener.AcceptTcpClient() ... Aqui o PowerShell aguarda conexões. Em outro terminal conecte-se a esta porta. Ex: telnet localhost 3281. PS C:\> $stream = $client.GetStream() PS C:\> $enviar = ([text.encoding]::ASCII).GetBytes("Bem vindo mestre!") PS C:\> $stream.Write($enviar, 0, $enviar.Length) ... Aqui a msg de boas vindas foi enviada. Verifique no terminal cliente. PS C:\> [byte[]]$bytes = 0..65535|%{0} PS C:\> $encod = New-Objet -TypeName System.Text.ASCIIEncoding PS C:\> while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) { >> $data = $encod.GetString($bytes, 0, $i) >> Write-OutPut $data >>} >> pressione ENTER para iniciar. ... Aqui criamos um loop para receber o que for digitado pelo terminal cliente. ... No cliente digite alguma coisa. O que voce digitar lah serah replicado aqui:)
Interenssante, não? Com base nisso pode ser desenvolvido um script para administração remota e coisas do tipo. Futuramente veremos algo nesse sentido.
Por enquanto é isso. Logo posto aqui mais dicas sobre o PowerShell e de como gerar scripts para automatizar ainda mais estas funcionalidades :)
Abraço.