使用PSEXEC远程运行WindowsUpdates3.exe功能异常问题咨询
我之前也碰到过类似的远程执行工具的参数传递和权限上下文问题,结合你的情况来分析下:
问题回顾
你用WindowsUpdates3.exe(Python脚本转的EXE)管理Windows更新时,遇到了两种执行方式的明显差异:
- 先通过PsExec启动远程CMD会话,再运行EXE:所有参数都能正常工作,功能和本地运行一致;
- 直接用PsExec调用EXE:只有
-h/-v能正常返回结果,其他参数要么无输出(但返回错误码0),要么抛出com_error: -2147024891(对应"拒绝访问")。
先贴一下这个EXE的官方使用说明:
usage: WindowsUpdates3.exe [-h] [-v] [-m] [-i] [-u] [-r] [-s SKIP]
List, download and update Windows clients
optional arguments:
-h, --help show this help message and exit
-v, --version Show program version and exit
-m, --list-missing List missing updates
-i, --list-installed List installed updates
-u, --update List and install missing updates
-r, --reboot Reboot after installing updates if needed
-s SKIP, --skip SKIP Skips these KB numbers
核心原因分析
1. 最可能的:参数传递被PsExec拦截了
你当前的命令写法是:
PSEXEC.exe \\<hostname> -h "C:\\WindowsUpdates\\WindowsUpdates3.exe" -i
这里的-i会被PsExec本身解析(PsExec的-i参数是用来指定在交互式用户会话中运行进程的),而不是传递给WindowsUpdates3.exe!这就导致目标EXE根本没收到-i参数,自然没有输出(错误码0是因为EXE正常启动但没触发对应功能逻辑)。
而-h/-v能正常工作,是因为这两个参数不是PsExec的内置参数,所以被正确传递给了目标程序。
2. 权限上下文的差异
即使参数传递对了,非交互式启动的进程和交互式CMD会话的权限环境还是有区别:
- Windows Update的COM组件(比如
Microsoft.Update.Session)需要访问系统级的注册表和服务,非交互式会话可能缺少某些关键权限(比如交互式桌面权限); - PsExec的
-h参数虽然提升了权限,但非交互式进程的令牌可能没有加载完整的用户权限列表,导致COM调用时出现"拒绝访问"。
3. Python打包的潜在问题
如果是用PyInstaller这类工具打包的EXE,非交互式环境下可能存在:
- 临时解压文件的权限问题(有些打包模式会把文件解压到用户临时目录,远程非交互式会话的临时目录权限受限);
- 依赖库缺失(打包时没包含某些隐藏的系统依赖,交互式会话中系统会自动加载,但非交互式不会)。
解决方案步骤
第一步:修正参数传递方式
用--分隔PsExec的参数和目标程序的参数,确保目标EXE能正确接收参数:
PSEXEC.exe \\<hostname> -h -- "C:\\WindowsUpdates\\WindowsUpdates3.exe" -i
这里的--告诉PsExec:后面的所有参数都直接传递给目标程序,不要自行解析。这一步应该能解决大部分参数无响应的问题。
第二步:强制启用交互式会话
如果还是遇到权限问题,加上PsExec的-i参数(注意和目标程序的-i区分开),让进程在交互式会话中运行:
PSEXEC.exe \\<hostname> -h -i -- "C:\\WindowsUpdates\\WindowsUpdates3.exe" -u
第一个-i是PsExec的参数,用于加载交互式桌面会话;第二个-u是传递给WindowsUpdates3.exe的更新参数。
第三步:对比环境变量与权限
如果问题还存在,对比两种执行方式的权限和环境变量:
- 在交互式CMD中运行:
whoami /priv > C:\temp\priv_interactive.txt set > C:\temp\env_interactive.txt - 用PsExec直接运行:
PSEXEC.exe \\<hostname> -h -- cmd /c "whoami /priv > C:\temp\priv_psexec.txt & set > C:\temp\env_psexec.txt" - 下载这四个文件对比,找出权限或环境变量的差异,针对性调整(比如手动设置缺失的环境变量,或者添加对应权限)。
第四步:检查打包配置
如果是Python打包的问题:
- 尝试用
--onedir模式打包(而不是--onefile),避免临时解压的权限问题; - 用
--debug模式重新打包,查看EXE启动时的日志,确认是否有依赖缺失; - 在远程机器上手动运行EXE,查看是否有弹窗提示缺失DLL(非交互式会话中弹窗会被隐藏)。
内容的提问来源于stack exchange,提问作者MeMario




