首页 文章

Powershell远程注册表访问非域服务器

提问于
浏览
0

我有以下脚本用于收集各种服务器上安装的应用程序:

$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 回答

  • 0

    我没有找到这个问题的实际原因或解决方案,但我确实找到了解决方法 . 将卸载注册表项添加到AllowedPaths条目允许我执行我想要的操作 . 不确定为什么一台服务器需要这个而另一台服务器不需要,但我可以这样做 .

相关问题