远程Powershell从许多服务器检索特定的注册表值

时间:2015-02-10 15:12:52

标签: powershell remote-registry

我有以下内容..

$output = @()
$servers =Get-Content "C:\Windows\System32\List3.txt"

foreach ($server in $servers)
{
    trap [Exception] {continue}
    Import-Module PSRemoteRegistry
    $key="SOFTWARE\Microsoft\'Microsoft Antimalware'\'Signature Updates'"

    $regkey=Get-RegBinary -ComputerName $server -Key $Key -Value SignatuesLastUpdated

    #$regkey=(Get-Item HKLM:\SOFTWARE\Microsoft\'Microsoft Antimalware'\'Signature Updates').getValue('SignaturesLastUpdated')

    #$regkey=[datetime]::ParseExact("01/02/03", "dd/MM/yy", $null) | Export-csv -path c:\temp\avinfo.csv -append

    #$regkey
}

$output | Select $server , $Regkey | Export-Csv c:\temp\avinfo.csv -NoTypeInformation

我认为它非常接近,但并不是按需要工作 - 任何人都可以告诉我我在这里做错了什么 - 已经阅读了很多并且设法做到这一点,只需要帮助来完成

由于

1 个答案:

答案 0 :(得分:1)

好的...所以有很多需要更改才能使其正常工作。我会在发布后经常更新答案。

$servers = Get-Content "C:\Windows\System32\List3.txt"
$key="SOFTWARE\Microsoft\Microsoft Antimalware\Signature Updates"

$servers | ForEach-Object{
    $server = $_
    Try{
        Get-RegBinary -ComputerName $server -Key $Key -Value SignatuesLastUpdated -ErrorAction Stop
    } Catch [exception]{
        [pscustomobject]@{
            ComputerName = $server
            Data = "Unable to retrieve data"
        }
    }
} | Select ComputerName,@{Label=$value;Expression={If(!($_.Data -is [string])){[System.Text.Encoding]::Ascii.GetBytes($_.data)}Else{$_.Data}}} | Export-Csv c:\temp\avinfo.csv -NoTypeInformation

上述代码的作用更符合您的意图。获取列表,并为每个项目从该服务器获取关键数据。如果获取该数据存在问题,那么我们输出一个自定义对象,说明我们可以在输出中判断是否存在问题。空闲的部分是您希望如何将二进制数据导出到文件。就目前而言,它应该创建一个以空格分隔的字节串。

您应该突出显示的问题是

  1. 无需为每个服务器导入模块。将该呼叫移出循环
  2. 您已声明变量$output但在循环过程中不填充它。这对foreach构造很重要。最后,你向csv发送并清空数组。我的答案不需要它,因为它只使用标准输出。
  3. 正如@Meatspace所指出的,您在此处输入了一个拼写错误:SignatuesLastUpdated
  4. Get-RegBinary默认情况下不会创建try / catch块所需的终止错误。添加了-ErrorAction Stop。不要认为你的代码trap [Exception] {continue}会抓到任何东西。
  5. $key中的单引号可能阻止了解析路径。你试图逃避空间,只需要将整个字符串括在一组引号中即可实现。
  6. 虽然Select可以使用变量,但它们以基本形式存在,以选择属性名称。简而言之,你错了。