PsExec.exe在SYSTEM上下文运行PowerShell时报创建密钥文件访问被拒绝错误
问题场景
执行PsExec命令尝试拉起SYSTEM权限的PowerShell终端时触发访问拒绝报错,执行命令及返回信息如下:
C:\Users\{myUserName}>PsExec.exe -i -s "C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe" PsExec v2.34 - Execute processes remotely Copyright (C) 2001-2021 Mark Russinikov Sysinternals - www.sysinternals.com Error creating key file on {MachineName}: Access is denied.
操作背景:
- 初始目的:通过SYSTEM系统账户上下文启动PowerShell终端
- 最终目的:通过PsExec执行PowerShell脚本生成VPN配置所需的PBK文件,计划执行的完整命令如下:
psexec.exe -i -s powershell.exe .\convertXML.ps1 -xmlFilePath .\vpntemplate.xml -ProfileName "TestVPN"
- 操作参考:微软官方发布的Windows 10 VPN设备隧道配置指南相关内容
根因说明
Error creating key file: Access is denied是PsExec的典型权限类报错,触发原因通常有以下几类:
- 启动PsExec的终端没有本地管理员权限:PsExec要拉起SYSTEM权限进程,首先需要自身运行在具备管理员令牌的上下文里,普通用户权限启动的终端调用PsExec会直接被拦截,无法在系统目录写入临时通信密钥文件。
- 本地Admin$管理共享被禁用:PsExec默认依赖指向
C:\Windows路径的Admin$共享写入临时服务文件、创建认证密钥,该共享被关闭时会直接触发写入失败。 - 系统安全策略或安全软件拦截:工作组环境下默认开启的UAC本地账户令牌过滤会把管理员账户的非交互登录权限降级为普通用户;EDR、杀毒软件如果拦截PsExec创建服务、写入系统目录的行为,也会返回同类访问拒绝错误。
- 命令本身存在路径缺陷:计划执行的脚本命令使用
.\开头的相对路径,而SYSTEM账户的默认工作目录是C:\Windows\System32,就算权限问题解决,也会因为找不到脚本和XML文件执行失败。
修复步骤
- 提权启动终端:右键点击CMD或PowerShell图标,选择「以管理员身份运行」,在弹出的提权终端中先执行基础测试命令,验证SYSTEM拉起能力:
命令执行后会弹出新的PowerShell窗口,在窗口内执行PsExec.exe -i -s "C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"whoami,如果返回nt authority\system说明基础提权功能正常。 - 检查Admin$共享状态:在提权终端执行
net share,查看返回列表中是否存在ADMIN$资源、对应路径为C:\Windows。如果不存在,执行net share ADMIN$=C:\Windows临时开启该共享,操作前需确认系统Server服务处于运行状态。 - 排查拦截规则:如果是工作组环境,打开注册表编辑器定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System路径,新建名为LocalAccountTokenFilterPolicy的DWORD值,将数值设为1后重启设备生效;同时检查安全软件的拦截日志,对PsExec的临时服务创建、系统目录写入行为放行。 - 修正脚本执行命令:将脚本、XML配置文件的路径替换为绝对路径,同时添加PowerShell执行策略绕过参数,避免脚本被默认策略拦截,参考命令如下:
psexec.exe -i -s powershell.exe -ExecutionPolicy Bypass -File "C:\脚本实际存放目录\convertXML.ps1" -xmlFilePath "C:\脚本实际存放目录\vpntemplate.xml" -ProfileName "TestVPN"
内容的提问来源于stack exchange,提问作者Daikyu
相关产品推荐
相关产品推荐

