无法从远程注册表HKU SID路径获取打印机列表,求解决方案
问题原因与解决方法
核心问题
- 用户配置文件未加载:HKEY_USERS下的用户SID子键仅在用户登录目标远程机器时才会被加载到注册表。如果目标用户未登录,其对应的注册表单元(NTUSER.DAT)处于离线状态,远程注册表无法直接访问。
- 脚本逻辑错误:原脚本仅调用
OpenSubKey打开注册表键,并未获取该键下的子键列表;直接将RegistryKey对象传入Out-GridView,无法解析出子键信息,因此返回空表格。
解决方案
场景1:目标用户已登录远程机器
修改脚本,添加子键获取逻辑:
$userId = "userid" $compName = "computerName" # 获取用户SID $sid = (Get-ADUser -Identity $userId).SID.Value # 构建打印机连接注册表路径 $printerConnPath = "$sid\Printers\Connections\" # 打开远程HKEY_USERS基键 $remoteHKU = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::Users, $compName) # 尝试打开目标子键 $connKey = $remoteHKU.OpenSubKey($printerConnPath) if ($connKey) { # 获取所有子键名称(格式即为,,serverName,printerName) $connKey.GetSubKeyNames() | Out-GridView -Title "已安装打印机连接" $connKey.Close() } else { Write-Warning "无法找到指定路径:可能目标用户未登录远程机器,或路径不存在" }
场景2:目标用户未登录远程机器
需加载离线的NTUSER.DAT文件(需远程机器管理员权限):
$userId = "userid" $compName = "computerName" $adminCred = Get-Credential -Message "输入远程机器管理员凭据" # 获取用户SID $sid = (Get-ADUser -Identity $userId).SID.Value # 远程执行离线注册表加载与查询操作 Invoke-Command -ComputerName $compName -Credential $adminCred -ScriptBlock { param($userId) # 默认用户配置文件路径(若为自定义路径需调整) $ntuserPath = "C:\Users\$userId\NTUSER.DAT" if (Test-Path $ntuserPath) { # 加载离线注册表到HKLM临时键 reg load HKLM\TempUser $ntuserPath # 获取打印机连接子键列表 $subKeys = Get-ChildItem "HKLM:\TempUser\Printers\Connections\" -Name # 输出结果 $subKeys # 卸载临时键(必须执行,否则NTUSER.DAT会被锁定) reg unload HKLM\TempUser } else { Write-Warning "未找到用户配置文件:$ntuserPath" } } -ArgumentList $userId | Out-GridView -Title "离线用户打印机连接"
注意事项
- 确保远程机器已开启
Remote Registry服务,且执行脚本的用户拥有远程注册表访问权限(或管理员权限)。 - 离线加载注册表后必须执行卸载操作,否则目标用户的配置文件会被锁定,无法正常登录。
内容的提问来源于stack exchange,提问作者Kenneth Fish
相关产品推荐
相关产品推荐

