非AD环境下通过PSSession执行高权限命令失败,求解决办法
问题原因
非AD环境下,Windows的**远程UAC过滤(Remote UAC Filtering)**会限制本地管理员账号的远程权限:当本地管理员通过网络(如WinRM/PSSession)连接时,系统会自动剥离其管理员权限令牌,仅保留标准用户权限,导致无法执行编辑注册表、配置防火墙这类高权限操作。而AD域管理员不受此限制,所以AD环境中流程能正常运行。
解决方案
1. 修改远程主机注册表,禁用远程UAC过滤
这是最彻底的解决方法,修改后本地管理员的远程会话会保留完整权限:
# 先远程执行注册表修改(需确保当前能建立基础会话) Invoke-Command -ComputerName $server -Credential $MySecureCreds -ScriptBlock { Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" ` -Name "LocalAccountTokenFilterPolicy" -Value 1 -Type DWord -Force # 重启WinRM服务让设置生效 Restart-Service WinRM -Force }
完成后重新创建PSSession,再执行高权限命令就能正常运行了。
2. 检查并配置WinRM基本认证(非域环境必备)
非AD环境下WinRM默认可能未开启基本认证,虽然你能建立会话,但还是建议确认:
# 检查基本认证状态 Invoke-Command -ComputerName $server -Credential $MySecureCreds -ScriptBlock { Get-Item WSMan:\localhost\Service\Auth\Basic } # 若未启用,执行以下命令开启 Invoke-Command -ComputerName $server -Credential $MySecureCreds -ScriptBlock { Set-Item WSMan:\localhost\Service\Auth\Basic -Value $true -Force }
3. 远程会话内强制提权(备选方案)
如果暂时无法修改注册表,可在ScriptBlock里用Start-Process以管理员身份运行脚本:
Invoke-Command -Session $session -ScriptBlock { Start-Process powershell.exe -ArgumentList "-File C:\path\to\your\config-script.ps1" ` -Verb RunAs -Wait -NoNewWindow }
注意:这种方式在无交互场景下可能受UAC弹窗限制,优先推荐注册表方案。
重要提示
LocalAccountTokenFilterPolicy=1仅影响本地管理员的远程权限,不会改变本地登录时的权限。- 修改注册表后必须重启WinRM服务,设置才会生效。
内容的提问来源于stack exchange,提问作者TheRealJoeSchmoe
相关产品推荐
相关产品推荐

