换句话说:如何远程运行 Windows 10 上的 GUI 应用程序?
背景:我们为第三方 CAD 工程软件构建和测试插件。为了运行我们的插件测试,我们需要首先激活 CAD 软件许可证,这只能通过 GUI 完成(根据第三方开发人员的说法)——没有 API。我们希望将测试集成到我们的 CI/CD 管道中,其中包括:
- 使用预装 CAD 软件的图像创建虚拟机,
- 激活许可证,
- 运行测试,
- 终止虚拟机。
VM 需要非常强大,并需要 GPU 支持,因此如果我们一直运行 VM,则会花费很多钱。
我写了一个非常简单的 Python 脚本pyautogui模拟用户的鼠标和键盘输入。它会打开 CAD 软件,点击一些窗口,输入电子邮件和密码,从而激活许可证。如果我通过 RDP 手动连接到 VM 并启动脚本,此解决方案就会起作用。
我通过更改注册表项让管理员用户自动登录,以便虚拟机在启动/重新启动时立即以登录状态运行:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
我将 Python 脚本添加到自动启动 (shell:startup),以便它在机器启动时启动。我想我也可以将其设为计划任务。同样,当通过 Azure 门户手动创建机器时,一切都会正常。
问题就在这里:我现在想做同样的事情,但从 Azure Devops 管道自动完成,并且我需要知道我的 Python 脚本何时完成其工作。
在 Azure Devops 管道中使用 PowerShell/Yaml,我像以前一样创建了一个 VM,并且我想在交互式桌面会话的上下文中运行我的 python 脚本。但这并没有发生。脚本启动,进程的所有者似乎是正确的(这是我的管理员用户,而不是 SYSTEM),但它实际上只在后台运行(无法访问 GUI)。
为了验证我的假设,我运行了一个简单的命令来启动 MS Paint:
Invoke-AzVMRunCommand `
-ResourceGroupName '<my-group>' `
-VMName '<my-vm-name>' `
-CommandId 'RunPowerShellScript' `
-ScriptString "
& mspaint"
或者
Invoke-Command -Session $session -ScriptBlock {
& mspaint
}
我希望 MS Paint 以交互模式启动,即我希望当我通过 RDP 连接到该 VM 以检查结果时 Paint 窗口打开。
我还使用了tscon 命令尝试更改我正在交互的会话:
tscon.exe 1 /dest:console
但当我跑的时候奎斯塔命令,我似乎仍然在错误的地方:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
>services 0 Disc
console tester 1 Active
31c52344259d4... 65536 Listen
rdp-tcp 65537 Listen
任何建议都将受到高度赞赏!