如何在 Windows 10 上的交互式桌面会话中远程运行 Python 脚本?

如何在 Windows 10 上的交互式桌面会话中远程运行 Python 脚本?

换句话说:如何远程运行 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                      

任何建议都将受到高度赞赏!

相关内容