PowerShell脚本故障:获取AD用户SID并用于注册表修改失败
问题修复方案
你的脚本存在三个核心问题,以下是针对性的修正方案:
1. 正确提取用户SID的字符串值
Select-Object SID返回的是包含SID属性的对象,而非纯字符串值,需要直接提取SID的实际内容:
$username = Read-Host -Prompt '输入用户名' # 直接获取SID的字符串格式值 $SID = (Get-ADUser -Identity $username).SID.Value
2. 修复命令字符串的引号嵌套与变量解析
原命令用单引号包裹导致$SID无法被PowerShell解析,同时嵌套引号逻辑混乱,改用双引号包裹并正确转义内部引号:
$PSExec = "C:\Windows\System32\PsExec.exe" $hostname = Read-Host -Prompt '输入主机名' # 用双引号实现变量解析,内部引号用反引号`转义,添加/f参数自动覆盖现有值 $command = "cmd /c `"reg add `"`"HKEY_USERS\$SID\SOFTWARE\Policies\Microsoft\Internet Explorer\Control Panel`"`" /v ConnectionsTab /t REG_DWORD /d 0 /f`""
3. 调整Start-Process的参数传递方式
PsExec的参数需要正确拆分,避免空格导致的解析错误,建议将目标主机和命令拆分为独立参数:
# 添加-Wait等待命令执行完成,-NoNewWindow避免弹出额外窗口(可选) Start-Process -FilePath $PSExec -ArgumentList "\\$hostname", $command -Wait -NoNewWindow
完整修复后的脚本
$username = Read-Host -Prompt '输入用户名' $SID = (Get-ADUser -Identity $username).SID.Value $PSExec = "C:\Windows\System32\PsExec.exe" $hostname = Read-Host -Prompt '输入主机名' $command = "cmd /c `"reg add `"`"HKEY_USERS\$SID\SOFTWARE\Policies\Microsoft\Internet Explorer\Control Panel`"`" /v ConnectionsTab /t REG_DWORD /d 0 /f`"" Start-Process -FilePath $PSExec -ArgumentList "\\$hostname", $command -Wait -NoNewWindow
额外注意事项
- 运行脚本的账号需具备目标主机的管理员权限,以及Active Directory的用户读取权限
- 确认目标主机已启用文件和打印机共享服务(PsExec依赖此服务通信)
- 若PsExec未放置在System32目录,需指定完整工具路径
内容的提问来源于stack exchange,提问作者virtue
相关产品推荐
相关产品推荐

