使用Python调用PsExec远程执行批处理脚本时遇权限拒绝错误
解决PsExec远程执行"Access is denied. 5"权限问题
你手动运行PsExec能正常工作,但通过Python的subprocess调用就触发权限拒绝,这种情况大多是因为脚本执行环境和手动操作的上下文存在差异,或者命令拼接有细节疏漏。下面是几个具体的排查和修复方向:
1. 修正命令拼接的细节问题
你当前的字符串拼接方式可能存在空格转义或路径解析的问题,建议用更稳妥的方式构造命令:
import subprocess # 推荐用列表形式传递参数(避免shell=True的潜在风险) cmd = [ "psExec", "\\\\11.456.787.8", "-u", "user", "-p", "pwd", r"C:\basicfolder\run_1523448627.15.bat" ] subprocess.call(cmd)
注意路径用原始字符串r""可以避免反斜杠转义的麻烦;如果一定要用shell=True,可以用shlex.quote()处理用户名和密码,防止特殊字符导致命令解析错误。
2. 检查Python进程的运行权限
你手动操作是在自己的用户会话里,但如果Python脚本是通过服务、任务计划或者非管理员身份运行,权限会和手动操作不一致:
- 尝试右键点击Python脚本,选择以管理员身份运行,再执行看看是否解决问题。
- 如果是在IDE中运行脚本,确保IDE也是以管理员身份启动的。
3. 确认目标服务器的PsExec权限配置
即使账号密码正确,PsExec也有几个关键权限要求:
- 目标服务器必须开启
Admin$共享(默认是开启的,但如果被禁用会直接导致权限拒绝)。 - 你的账号需要加入目标服务器的本地管理员组,或者拥有远程执行进程的特定权限。
- 检查目标服务器的Windows防火墙,确保开放了PsExec所需的445端口(默认用于SMB通信)。
4. 规避明文密码的安全风险
最后提个小建议:直接在代码里写明文密码是严重的安全隐患,建议用环境变量或者加密存储的方式传递密码,比如:
import os import subprocess pwd = os.getenv("REMOTE_SERVER_PASSWORD") cmd = [ "psExec", "\\\\11.456.787.8", "-u", "user", "-p", pwd, r"C:\basicfolder\run_1523448627.15.bat" ] subprocess.call(cmd)
运行脚本前先设置好环境变量REMOTE_SERVER_PASSWORD即可。
内容的提问来源于stack exchange,提问作者Sravani Chinta
相关产品推荐
相关产品推荐

