[英]Powershell Remote Registry Access to Non-Domain Server
我有以下脚本,用于收集各种服务器上已安装的应用程序:
$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 Standard服务器上工作时,问题就来了。 一台服务器正常运行,另一台服务器运行不正常。 在不起作用的服务器上,出现以下错误:
Exception calling "OpenSubKey" with "1" argument(s): "Requested registry access is not allowed."
我不知道为什么这将适用于一台服务器而不适用于另一台服务器。 我正在Windows 7 x64计算机上从非高架Powershell运行脚本。
更新:
我使用Process Monitor来跟踪两台计算机上的Remote Registry服务的工作。 在一切正常的机器上,我看到4个HKLM \\ System \\ CurrentControlSet \\ Control \\ SecurePipeServers \\ winreg读取,然后它开始从HKLM \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall提取我想要的信息。 在无法正常运行的计算机上,远程注册表对winreg密钥执行相同的4次读取,但随后开始读取HKLM \\ System \\ CurrentControlSet \\ Control \\ SecurePipeServers \\ winreg \\ AllowedPaths和HKLM \\ System \\ CurrentControlSet \\ Control \\ SecurePipeServers \\ winreg \\ AllowedExactPaths。 我进行了一些调查,然后远程注册表在继续之前检查了winreg密钥的权限。 我比较了好机器和坏机器,并且注册表项和权限都完全相同,并且是默认安装的。
我没有找到解决此问题的实际原因或解决方案,但确实找到了解决方法。 将卸载注册表项添加到AllowedPaths条目后,我便可以执行所需的操作。 不知道为什么一台服务器需要这个,而另一台则不需要,但是我可以这样进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.