Опитвам се да изпълня автоматизиран тест на отдалечен сървър. За да може тестът да се проведе, потребителят трябва да бъде удостоверен в система с помощта на десктоп приложение. По принцип, след като стартирате настолното приложение, се показва прозорец на GUI и след това въвеждате парола и натискате enter. След като потребителят бъде удостоверен, автоматичният тест може да започне.
Написах скрипт на Powershell, след което, когато се стартира, може да стартира GUI приложението, да въведете паролата, да натиснете OK и потребителят се удостоверява. Работи без никакви проблеми, ако съм влязъл в машината чрез активна връзка с отдалечен работен плот.
$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`
Знам, че това се изпълнява, защото виждам, че въвежда паролата и след това натиска бутона OK, докато е влязъл чрез връзка с отдалечен работен плот. Също така показва „вярно“ в Powershell ISE, когато стигне до извикванията на AppActivate
Сега се опитах да изпълня този скрипт дистанционно чрез PS сесия от друга машина. Дистанционното управление е включено и конфигурирано правилно. Виждам, че скриптът се изпълнява, но не може да намери прозореца на GUI, защото виждам "фалшиви" низове да се показват на екрана на отдалечената машина, от която го изпълнявам. Това е скриптът на 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