Я работал над этим некоторое время и понял, что проблема главным образом в том, как манипулировать данными.
У меня есть команда, которая извлекает данные из удаленных реестров для списка серверов
$RegData = Get-RegValue -ComputerName $($Target.ComputerName) -Hive $RegHive -Key $KeyName -ping -ErrorAction Stop -WarningAction Stop
Проблема здесь очевидна для меня сейчас, когда я посмотрел на данные - число ключей / значений, возвращаемых из запроса реестра, является переменной.
ComputerName Hive Key Value Data
------------ ---- --- ----- ----
SERVER1 LocalMachine SOFTWARE\NSS\Serv... AssetNumber 987412
SERVER1 LocalMachine SOFTWARE\NSS\Serv... BuildDate 02/02/2017
SERVER1 LocalMachine SOFTWARE\NSS\Serv... iLODefaultPwd NA
ComputerName Hive Key Value Data
------------ ---- --- ----- ----
SERVER2 LocalMachine SOFTWARE\Serv... AssetNumber 984213
SERVER2 LocalMachine SOFTWARE\Serv... BuildDate 02/02/2017
SERVER2 LocalMachine SOFTWARE\Serv... iLODefaultPwd NA
SERVER2 LocalMachine SOFTWARE\Serv... ContactTel 8237
Реестримя ключа является константой, но в нем может быть много пар данных и значений:
Это означает, что подача его в массив / массив адресов, как этот, не будет работать:
Function GetRegistryData {
ForEach ($Target in $ImportData) {
$RegData = Get-RegValue -ComputerName $($Target.ComputerName) -Hive $RegHive -Key $KeyName -ping -ErrorAction Stop -WarningAction Stop
$NewObject = New-Object PSObject
$NewObject | Add-Member -NotePropertyName 'ComputerName' -NotePropertyValue $Target.ComputerName
$NewObject | Add-Member -NotePropertyName 'Key' -NotePropertyValue $KeyName
$RegData | ForEach {
$NewObject | Add-Member -NotePropertyName $_.Value -NotePropertyValue $_.Data
}
$NewObject | Add-Member -NotePropertyName 'Hive' -NotePropertyValue $RegHive
$NewObject | Add-Member -NotePropertyName 'Type' -NotePropertyValue $RegData[0].Type
$NewObject
}
}
Массив будетбыть определенным первым набором значений, которые я отправляю (или если при сборе данных возникнет ошибка, по умолчанию будут заданы 4 определенных свойства), и я потеряю дополнительные значения при последующих записях с большим количеством значений.В этом примере он не будет добавлять значения «SERVER2», потому что есть новое поле, и если при извлечении возникнет ошибка, он установит ComputerName, Key, Hive, Type в качестве полей объекта и проигнорирует любые другие
Anyуказатели на то, как я могу легко сопоставить эти данные в объект - я пытаюсь получить запись для каждого сервера с полями Value, Data, как показано ниже:
ComputerName Hive Key AssetNumber BuildDate
------------ ---- --- ----- ----
SERVER1 LocalMachine SOFTWARE\Serv... 987412 02/02/2017
SERVER2 LocalMachine SOFTWARE\Serv... 984123 02/02/2017
Тот факт, что я не знаю всехИмена свойства noteproperty уже сейчас дают мне блок.Я мог бы заранее просканировать ВСЕ реестры серверов и получить все уникальные имена, но это кажется довольно расточительным решением.