PowerShell脚本无法找到已存在且有权限读取的SCOM注册表项
解决PowerShell访问SCOM注册表项时的路径错误问题
从错误信息可以明确:PowerShell将你指定的注册表路径误识别为文件系统路径,自动拼接了当前用户目录(C:\Users\UserName\...),这是因为Get-Item默认操作文件系统,直接传入HKEY_LOCAL_MACHINE开头的字符串无法被识别为注册表位置。
修正方案
1. 核心修复:使用PowerShell注册表PSDrive
PowerShell内置了专门的注册表驱动器(HKLM:对应HKEY_LOCAL_MACHINE),用它指定路径就能正确识别注册表位置。同时优化脚本逻辑,避免重复读取注册表项:
# 使用HKLM PSDrive指定注册表路径 $scomRegistryPath = "HKLM:\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup" # 一次性读取注册表项对象,避免重复调用Get-Item $scomRegItem = Get-Item -Path $scomRegistryPath -ErrorAction Stop # 读取对应注册表值 $scomDisplayName = $scomRegItem.GetValue("DisplayName") $scomVersion = $scomRegItem.GetValue("DisplayVersion") $scomBuild = $scomRegItem.GetValue("BuildNumber") # 输出结果 Write-Host "SCOM Name: $scomDisplayName" Write-Host "SCOM Version Number: $scomVersion" Write-Host "SCOM Build Number: $scomBuild"
2. 处理64位系统注册表重定向问题
如果是64位系统上运行32位PowerShell,注册表会自动重定向到Wow6432Node分支,此时可以通过指定注册表视图强制访问64位分支:
# 32位PowerShell访问64位注册表分支 $scomRegItem = Get-Item -Path "HKLM:\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup" -RegistryView 64 -ErrorAction Stop
3. 简化写法:使用Get-ItemProperty
也可以直接用Get-ItemProperty一次性读取所有需要的值,代码更简洁:
$scomRegistryPath = "HKLM:\SOFTWARE\Microsoft\Microsoft Operations Manager\3.0\Setup" $scomProps = Get-ItemProperty -Path $scomRegistryPath -ErrorAction Stop Write-Host "SCOM Name: $($scomProps.DisplayName)" Write-Host "SCOM Version Number: $($scomProps.DisplayVersion)" Write-Host "SCOM Build Number: $($scomProps.BuildNumber)"
内容的提问来源于stack exchange,提问作者saturnSam
相关产品推荐
相关产品推荐

