Método SendKeys no Powershell

2

Eu tenho arquivo de lote para telnet um servidor automaticamente, eu quero fazer a mesma coisa com o PowerShell

Arquivo em lote denominado Script.bat:

:: Open a Telnet window
 start telnet.exe 10.84.10.85
:: Run the script
 cscript SendKeys.vbs

Arquivo de Comando denominado SendKeys.vbs:

set OBJECT=WScript.CreateObject("WScript.Shell")
 WScript.sleep 1000
 OBJECT.SendKeys "myPassword{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "7{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "1{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "Y{ENTER}"
 WScript.sleep 3000
 OBJECT.SendKeys ""
    
por yazan 13.09.2017 / 14:29

2 respostas

4

O PowerShell não tem nenhuma funcionalidade incorporada para emular pressionamentos de teclas.

Praticamente, você tem duas opções: COM-Automation e Interop.

  1. SendKeys via COM

Como em VB (S), você pode criar um Shell-Object e SendKeys. Aqui está a maneira do PowerShell de fazer isso.

$wshell = New-Object -ComObject wscript.shell;
$wshell.SendKeys('a')

Se você quiser enviar um pressionamento de tecla a uma janela, primeiro é necessário ativá-lo:

$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('title of the application window')
Sleep 1
$wshell.SendKeys('~')

Alguns pressionamentos de teclas têm variáveis especiais como ~ para RETURN. Aqui é uma lista completa.
Depois de ativar uma janela, geralmente é necessário aguardar um segundo até que ela se torne responsiva, caso contrário, enviará a chave para a janela do PowerShell ou para lugar nenhum. O método SendKeys do host de script pode não ser confiável, mas felizmente há uma abordagem melhor.

  1. SendKeys via Interop

Como em C #, você pode usar o método SendWait do .NET Framework no PowerShell .

[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[System.Windows.Forms.SendKeys]::SendWait("x")

Se você quiser ativar uma janela, pode ser assim:

[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
[Microsoft.VisualBasic.Interaction]::AppActivate("Internet Explorer - Windows")

Para dormir, você pode usar o Iniciar o sono .

Com relação ao seu problema original, sugiro a seguinte solução:

# Open a Telnet window
Start-Process telnet.exe -ArgumentList 10.84.10.85
# Run the keystrokes
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('myPassword{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('7{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('1{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('Y{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('')

AVISO: Tenha cuidado extra se estiver usando este método para enviar uma senha, porque ativar uma janela diferente entre invocar o AppActivate e chamar SendKeys fará com que a senha seja enviada para aquela janela diferente em texto simples (por exemplo, seu mensageiro favorito !

    
por 13.09.2017 / 18:19
0

Eu fiz algumas modificações no script, eu tenho uma lista de servidores IP que tem a mesma senha e eu quero telnetar a lista automaticamente e sendKey para desativar ou ativar o servidor FTP.

meu script é:

  ## - List of IP
  $printers = get-content "C:\Dir2\servers.txt"

  foreach ($IPAddress in $printers){

   ## - Start Telnet Session:
     start-process C:\Windows\System32\telnet.exe -argumentlist $IPAddress

   ## - SendKey for each IP
     $obj = New-Object -com Wscript.Shell
     sleep -s 3
     $obj.SendKeys("MyPassword{ENTER}")
     sleep -s 3
     $obj.SendKeys("7{ENTER}")
     sleep -s 3
     $obj.SendKeys("1{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     $obj.SendKeys("Y{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     }
    
por 14.09.2017 / 10:00