Я пытаюсь выполнить автоматический тест на удаленном сервере. Для запуска теста пользователь должен пройти аутентификацию в системе с помощью настольного приложения. По сути, после запуска настольного приложения отображается окно графического интерфейса, затем вы вводите пароль и нажимаете Enter. После аутентификации пользователя можно запустить автоматический тест.
Я написал сценарий Powershell, а затем, когда он запускается, он может запустить приложение с графическим интерфейсом, ввести пароль, нажать «ОК», и пользователь будет аутентифицирован. Он работает без проблем, если я вхожу в систему через активное подключение к удаленному рабочему столу.
$password = "password"
& 'C:\Windows\GuiPassword.exe'
Start-Sleep -Seconds 60
$wshell = New-Object -ComObject wscript.shell;
write-output "Focusing on the window"
$wshell.AppActivate('Gui Password')
Sleep 2
write-output "Entering the password string"
write-output "$wshell.SendKeys('$password')"
$wshell.SendKeys("$password")
$wshell.AppActivate('Gui Password')
Sleep 2
write-output "Entering Enter key"
$wshell.SendKeys('{ENTER}')
Sleep 10`
Я знаю, что это работает, потому что я вижу, как он вводит пароль, а затем нажимает кнопку «ОК» при входе в систему через подключение к удаленному рабочему столу. Также он отображает «true» в Powershell ISE, когда доходит до вызовов AppActivate.
Теперь я попытался выполнить этот сценарий удаленно через сеанс PS с другой машины. Удаленное взаимодействие включено и настроено правильно. Я вижу выполнение сценария, но он не может найти окно графического интерфейса, потому что я вижу «ложные» строки, отображаемые на экране на удаленной машине, с которой я его выполняю. Это сценарий powershell, который я выполняю с другого компьютера. Предположим, что приведенный выше сценарий сохранен как сценарий PowerShell с именем GUILogin.ps1:
$tpassword = "password"
$secPasswd = ConvertTo-SecureString -AsPlainText -Force -String $tpassword
$myCreds = New-Object System.Management.Automation.PSCredential -argumentlist "REMOTESYSTEMUSERID", $secPasswd
$ps_Opt = New-PSSessionOption -IdleTimeout 43199999
$TargetSession = New-PSSession -ComputerName RemoteSystemname -Credential $myCreds -ConfigurationName RemoteExecution -SessionOption $ps_Opt
Write-Output "Session created"
Invoke-Command -Session $TargetSession -Command {D:\Temp\GUILogin.ps1}
Remove-PSSession $TargetSession
Я предполагаю, что он не может найти его, потому что это настольное приложение и требует активного рабочего стола. Это правильно? Не могли бы вы предложить, что я могу сделать, чтобы его можно было найти через сеанс PS?
Спасибо
psexec
или использовать удаленныйTask Scheduler
через Powershell Remoting, но последний хакерский и очень привередливый, чтобы сделать правильно. См. ссылку в дублирующемся комментарии, чтобы узнать, как вы можете использоватьpsexec
. - person Bender the Greatest   schedule 21.11.2019