我有以下脚本用于收集各种服务器上安装的应用程序:
$results = @()
$list = Get-Content serverlist.txt
foreach ($computer in $list) {
echo "Processing $($computer)"
if (Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet ) {
echo "Getting installed apps from $($computer) ..."
$UninstallKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
echo "Opening remote registry ..."
$reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computer)
echo "Getting registry keys ..."
if ($reg) {
$regkey=$reg.OpenSubKey($UninstallKey)
if ($regkey) {
$subkeys=$regkey.GetSubKeyNames()
echo "Building result object ..."
foreach($key in $subkeys){
$thisKey=$UninstallKey+"\\"+$key
$thisSubKey=$reg.OpenSubKey($thisKey)
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computer
$obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value $($thisSubKey.GetValue("DisplayName"))
$obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value $($thisSubKey.GetValue("DisplayVersion"))
$obj | Add-Member -MemberType NoteProperty -Name "InstallLocation" -Value $($thisSubKey.GetValue("InstallLocation"))
$obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value $($thisSubKey.GetValue("Publisher"))
$results += $obj
}
}
}
} else {
echo "$($computer) is DOWN!"
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computer
$obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value "Down"
$obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value "Down"
$obj | Add-Member -MemberType NoteProperty -Name "InstallLocation" -Value "Down"
$obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value "Down"
$results += $obj
}
}
$results | Where-Object { $_.DisplayName } | select ComputerName, DisplayName, DisplayVersion, InstallLocation, Publisher | Export-Csv D:\Temp\InstalledApps.csv
这适用于所有域成员服务器 . 当我尝试将其用于两个非域Windows 2008R2标准服务器时,问题就出现了 . 一台服务器工作正常,另一台服务器没有 . 在无法正常工作的服务器上,我收到以下错误:
Exception calling "OpenSubKey" with "1" argument(s): "Requested registry access is not allowed."
我无法弄清楚为什么这对一台服务器而不是另一台服务器有效 . 我在Windows 7 x64计算机上从非提升的Powershell运行脚本 .
更新:
我使用Process Monitor跟踪远程注册表服务在两台计算机上执行的操作 . 在运行正常的机器上,我看到HKLM \ System \ CurrentControlSet \ Control \ SecurePipeServers \ winreg的4次读取,然后它开始从HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall中提取我想要的信息 . 在没有工作的机器上,Remote Registry执行相同的4次winreg键读取,但随后开始读取HKLM \ System \ CurrentControlSet \ Control \ SecurePipeServers \ winreg \ AllowedPaths和HKLM \ System \ CurrentControlSet \ Control \ SecurePipeServers \ winreg \ AllowedExactPaths . 我做了一些调查,远程注册表检查winreg密钥的权限,然后继续 . 我比较了好机器和坏机器,注册表项和权限都完全相同,是默认安装的 .
1 回答
我没有找到这个问题的实际原因或解决方案,但我确实找到了解决方法 . 将卸载注册表项添加到AllowedPaths条目允许我执行我想要的操作 . 不确定为什么一台服务器需要这个而另一台服务器不需要,但我可以这样做 .