Jenkins调用PsExec命令提示‘Access is denied’问题排查求助
解决Jenkins中PsExec执行"Access is denied"的问题及Jenkins与CMD执行差异分析
咱们先从你的操作细节和核心差异入手,一步步解决这个权限拒绝的问题:
一、你的命令可能存在的小细节问题
先看你写的Jenkins bat命令:
'%windir%\\sysnative\\PsExec.exe \\\\ipaddress -u user -p password -accepteula -h cmd /c "command" /q"'
这里的/q参数位置不对——/q是CMD的安静模式参数,应该放在cmd的后面,而不是command之后。正确的写法应该是:
%windir%\\sysnative\\PsExec.exe \\\\ipaddress -u user -p password -accepteula -h cmd /q /c "command"
不过这个参数问题大概率不是权限拒绝的核心原因,但修正后能避免额外的命令解析错误。
二、Jenkins和CMD执行的核心差异
这才是你遇到问题的关键:
- 执行上下文完全不同
你手动打开的CMD是在当前登录的交互式用户上下文里运行的,这个用户通常有本地管理员权限,而且是桌面交互式登录,拥有完整的会话权限。
但Jenkins默认是用**本地系统账户(Local System)**或者专门的服务账户运行的——这是个后台服务账户,没有交互式登录权限,访问远程机器时会用Jenkins所在机器的机器账户(比如DOMAIN\JenkinsServer$)去认证,而这个账户几乎不可能拥有远程机器的管理员权限,自然会被拒绝。 - 权限令牌不一样
交互式用户的权限令牌包含了你登录时所属的所有用户组权限(比如本地管理员、域用户组),而Jenkins服务账户的权限是受限的系统级权限,在跨机器访问时,很多远程机器的安全策略会直接拒绝这种非交互式的服务账户访问。 - 环境变量与会话差异
交互式CMD的环境变量包含用户自定义的配置,而Jenkins服务的环境变量是纯系统级的;另外,Jenkins没有桌面会话,某些需要桌面交互的操作(虽然PsExec一般不需要)会直接失败,但这不是权限问题的核心。
三、解决"Access is denied"的具体方案
1. 修改Jenkins服务的运行账户(最有效)
这是从根源解决问题的方法:
- 打开Windows服务管理器(运行
services.msc),找到Jenkins服务。 - 右键选「属性」→「登录」选项卡,切换到「此账户」,输入一个拥有远程机器管理员权限的域账户或本地账户,填好密码后确定。
- 重启Jenkins服务,再重新运行构建任务。
这样Jenkins就会用这个有权限的账户执行PsExec,和你手动CMD的上下文完全一致,权限问题基本就能解决。
2. 调整远程机器的权限配置
如果不想改Jenkins账户,可以试试调整远程机器的安全策略:
- 确保你在PsExec里指定的
user账户确实是远程机器的管理员。 - 关闭远程机器的UAC管理员批准模式(谨慎操作,会降低安全性):打开
gpedit.msc,找到「计算机配置」→「Windows设置」→「安全设置」→「本地策略」→「安全选项」,把「用户账户控制:用于内置管理员账户的管理员批准模式」设为「已禁用」。 - 确认远程机器的
Admin$共享是开启的(PsExec需要通过这个共享复制文件),可以手动在CMD里访问\\ipaddress\Admin$测试是否能正常打开。
3. 验证Jenkins的执行账户
在Jenkins构建任务里加一个步骤,执行whoami命令,看看当前执行命令的账户是什么——如果显示的是NT AUTHORITY\SYSTEM,那就是默认的本地系统账户,肯定会有权限问题;如果是你指定的有权限的账户,再去排查远程机器的权限配置。
四、快速测试方法
手动用Jenkins的运行账户登录到Jenkins所在机器,打开CMD执行同样的PsExec命令,如果手动执行也失败,那就是账户权限的问题,和Jenkins本身无关;如果手动执行成功,那就是Jenkins的服务账户配置问题。
内容的提问来源于stack exchange,提问作者Pavel the coder
相关产品推荐
相关产品推荐

