我想远程启动一个应用程序。我使用以下 PsExec 命令:
PsExec \\computerOne -u Domain\User1 -p 123456 -x "C:\Windows\System32\calc.exe"
我尝试使用 -i 以便程序与桌面交互:
PsExec \\computerOne -u Domain\User1 -i 123456 -x "C:\Windows\System32\calc.exe"
但那不起作用。第二个示例中的错误是:
calc.exe 在 computerOne 上退出,错误代码为 -1073741502”
如果我省略规范,只写 exe 的路径,则该进程会在任务管理器中列出,但我看不到任何 UI。我是否必须更改要启动该程序的桌面上的任何设置?
答案1
你所看到的可能是会话 0 隔离- psexec 在远程计算机上安装并启动新服务,但它启动进程的默认会话为 0,因此当前登录的用户无法使用(至少在 Windows Vista/Server 2008 中)。您需要指定会话编号参数后面可以加上该命令-i
,也可以先使用该命令查询当前登录的用户(以及他们的会话号)quser /SERVER:computerOne
。
为了进行快速而粗略的测试,您可以假设第一个以交互方式登录的用户的会话 ID 是“1”。
答案2
您也可以取出 -x 并替换为 -I,它应该打开 PsExec \computerOne -u Domain\User1 -p 123456 -i "C:\Windows\System32\calc.exe"
答案3
根本原因似乎是Console.Write
中的方法产生的句柄泄漏Microsoft.powershell.consolehost.dll
。十六进制的 -1073741502 退出代码为 0xC0000142 (status_dll_init_failed)。
这似乎只出现在 Windows 7 和 2008 中(根据微软的KB2701373)。
边注:互联网上其他地方的几个“修复”都归因于执行某种神奇的咒语,然后关闭 PowerShell 并打开一个新实例。然而,“重新启动”PowerShell 实际上可以暂时解决问题。
答案4
我遇到了类似的问题:系统帐户(或其他非交互式会话)下的计划任务运行 PSExec,后者运行 SQLCMD,后者连接到本地 SQL 服务器。PSExec 返回错误 -1073741502。
这解决方案令人惊讶的是使用参数运行PSExec -i 0
。
使用以下方法运行 PSExec-i 1
不工作。