远程通过PSExec调用含GetForegroundWindow()的程序返回Idle问题排查
问题原因分析与解决办法
这个问题的核心在于Windows会话隔离机制和PSExec的默认运行上下文,下面具体拆解:
会话0隔离限制:从Windows Vista开始,系统引入了会话0隔离机制——系统服务和后台进程默认运行在会话0,而用户的交互式桌面会话(比如你手动操作的桌面)是会话1、2或更高编号。
GetForegroundWindow()函数只能获取当前运行所在会话的前台窗口,PSExec默认在会话0执行,这个会话没有用户交互的桌面窗口,所以返回的是会话0的空闲进程——也就是Idle。PSExec的默认运行模式:PSExec默认以系统账户在非交互式后台会话运行脚本,这种环境下不存在用户可见的前台窗口,自然无法获取到用户桌面的前台进程,只能返回Idle进程。
解决办法
要让脚本正确获取远程机器的用户前台窗口,你需要让脚本运行在用户的交互式会话中,具体操作:
先查询远程机器上用户的会话ID:
在本地运行命令:quser /server:远程机器IP或名称输出里会显示用户对应的会话ID(比如2)。
使用PSExec的
-i参数指定会话ID运行脚本:psexec \\远程机器IP或名称 -i 会话ID -u 用户名 -p 密码 你的脚本路径这样脚本就会在用户的交互式会话中执行,调用
GetForegroundWindow()就能正确获取到当前用户桌面的前台窗口进程了。
另外需要注意:如果远程机器有多个用户登录,要确保指定的会话ID是你想要获取窗口的那个用户的会话。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

