Удаленный Powershell для получения определенного значения реестра с множества серверов

у меня следующее..

$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

Я думаю, что это довольно близко, но не работает так, как нужно - может ли кто-нибудь сказать мне, что я здесь делаю неправильно - много читал и сумел зайти так далеко, просто нужна помощь для завершения.

Спасибо


person Dominic Lambert    schedule 10.02.2015    source источник
comment
^Добро пожаловать в StackOverflow: если вы публикуете образцы кода, XML или данных, пожалуйста выделите эти строки в текстовом редакторе и нажмите кнопку образцов кода ( { } ) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис. Это!   -  person marc_s    schedule 10.02.2015
comment
SignatuesLastUpdated должно быть SignaturesLastUpdated   -  person meatspace    schedule 10.02.2015
comment
Вы говорите не работает так, как нужно... Что именно не работает и как должно работать?   -  person arco444    schedule 10.02.2015


Ответы (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 может использовать переменные, в базовой форме они используются для выбора имен свойств. Короче, то, что у вас было, было не так.
person Matt    schedule 10.02.2015
comment
Спасибо за это - попробовал скрипт в соответствии с вашим комментарием (после исправления опечатки, которую я изначально сделал) - ну, он запустился, и почти каждый результат был Невозможно получить данные... Однако некоторые дали System.Byte{}, что я предполагаю является положительным результатом, но не предоставляет фактических данных. - person Dominic Lambert; 11.02.2015
comment
Я предполагаю, что служба удаленного реестра не работает для большинства серверов, которые я просматриваю, поэтому перехожу к следующему методу. - person Dominic Lambert; 11.02.2015
comment
@DominicLambert К вашему сведению, я обновляю ответ, чтобы вывести строковое представление данных. - person Matt; 26.02.2015