Как удаленно выполнить сценарий Powershell, для которого требуется активный рабочий стол

Я пытаюсь выполнить автоматический тест на удаленном сервере. Для запуска теста пользователь должен пройти аутентификацию в системе с помощью настольного приложения. По сути, после запуска настольного приложения отображается окно графического интерфейса, затем вы вводите пароль и нажимаете 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?

Спасибо


person My Display Name    schedule 21.11.2019    source источник
comment
Возможный дубликат Запуск удаленного приложения с графическим интерфейсом в Powershell   -  person Bender the Greatest    schedule 21.11.2019
comment
Короткий ответ: вы не можете. Вы потенциально можете использовать psexec или использовать удаленный Task Scheduler через Powershell Remoting, но последний хакерский и очень привередливый, чтобы сделать правильно. См. ссылку в дублирующемся комментарии, чтобы узнать, как вы можете использовать psexec.   -  person Bender the Greatest    schedule 21.11.2019
comment
Я пытался использовать psexec -i, но постоянно получаю следующее сообщение об ошибке: cmd вышел на ServerName с кодом выхода -1073741502 есть идеи, почему это происходит?   -  person My Display Name    schedule 26.11.2019
comment
c:\Sysinternals\PsExec.exe -i \\ИМЯ СЕРВЕРА -u ПОЛЬЗОВАТЕЛЬ -p ПАРОЛЬ /accepteula cmd /c powershell -noninteractive -ExecutionPolicy Bypass -file C:\PowershellScript.ps1 - это то, что я использовал   -  person My Display Name    schedule 26.11.2019