远程查询域内机器注册表键值的PowerShell脚本问题求助
解决PowerShell远程查询域机器注册表的问题
我来帮你搞定这个问题!你的脚本现在读到的是本地注册表值,核心问题是远程机器名引用错误,另外还有CSV输出不规范和缺少错误处理的问题,下面给你修正后的脚本和详细说明:
问题根源分析
- 机器名引用错误:你用
Get-ADComputer时选择了dnshostname属性,但循环里却用$SRV.name调用——这会返回空值!OpenRemoteBaseKey遇到空值时会默认连接本地机器,所以你读到的自然是本地注册表。 - CSV输出不规范:用
Out-File -Append手动拼接字符串很容易导致CSV格式混乱(比如分隔符不对、换行异常),应该用PowerShell的对象输出机制来生成标准CSV。 - 缺少错误处理:远程查询时经常会遇到机器离线、无权限访问注册表、指定键不存在的情况,不加处理的话脚本会直接中断,漏掉很多机器的结果。
修正后的完整脚本
Import-Module ActiveDirectory # 获取域内所有计算机的DNS主机名(直接展开成字符串数组,避免后续取属性) $SRVS = Get-ADComputer -Filter * -SearchBase 'DC=mydomain,DC=local' | Select-Object -ExpandProperty dnshostname # 初始化数组存储查询结果 $results = @() foreach ($SRV in $SRVS) { Write-Host "正在查询 $SRV..." try { # 建立远程注册表连接 $remoteReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $SRV) $targetKey = $remoteReg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\QualityCompat") # 处理注册表键不存在或键值为空的情况 $keyValue = switch ($true) { (-not $targetKey) { "注册表路径不存在" } (-not $targetKey.GetValue('cadca5fe-87d3-4b96-b7fb-a231484277cc')) { "键值为空或未设置" } default { $targetKey.GetValue('cadca5fe-87d3-4b96-b7fb-a231484277cc') } } # 将结果存入自定义对象 $results += [PSCustomObject]@{ 计算机名称 = $SRV 目标键值 = $keyValue } } catch { # 捕获所有异常,记录错误信息 $results += [PSCustomObject]@{ 计算机名称 = $SRV 目标键值 = "查询失败:$($_.Exception.Message)" } } } # 导出到CSV,指定UTF8编码避免乱码,去掉类型信息 $results | Export-Csv -Path "C:\Users\user1\Desktop\regkeys.csv" -NoTypeInformation -Encoding UTF8
关键修改说明
- 机器名修正:用
Select-Object -ExpandProperty dnshostname直接拿到每个机器的DNS名字符串,循环时直接用$SRV即可,不会再出现空值。 - 结构化输出:用
PSCustomObject定义每一行的结构,保证CSV的列名和数据对应,不会出现格式混乱。 - 异常处理:
try/catch块会捕获所有远程连接、注册表访问的错误(比如机器离线、权限不足),都会把错误信息记录到CSV里,不会中断脚本。 - 边界情况处理:判断注册表键是否存在、键值是否为空,返回友好的提示信息,不会出现空值或报错。
内容的提问来源于stack exchange,提问作者newprogrammer
相关产品推荐
相关产品推荐

