Добавляете разделитель для каждой запрашиваемой системы? Пользовательский объект
Мне сложно понять логику моего кода, чтобы он работал правильно. У меня есть только быстрый скрипт для получения версий программного обеспечения из удаленной системы и получения вывода в файл.
[System.Collections.ArrayList]$NetBIOSNames = @('ComputerOne','ComputerTwo')
[System.Collections.ArrayList]$softwareNames = @("ActivClient","Adobe Acrobat", "ATHOC", "DSET", "Firefox", "Google Chrome", "Java", "McAfee Agent")
[System.Collections.ArrayList]$VersionNumber = @()
[System.Collections.ArrayList]$CorrectVersion = @('7.2.1','21.001.20138','6.2.27.271','1.6.8','78.8.0','89.0.4389.72','8.0.2710.9','5.7.1.116')
foreach($Computer in $NetBIOSNames){
foreach ($software in $softwareNames) {
$Version = Invoke-Command -ComputerName $Computer -ScriptBlock {
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Where-Object {$_.displayname -like "*$Using:software*" }
}
$null = $VersionNumber.Add($($Version.DisplayVersion))
}
For($i=0; $i -lt $softwareNames.Count; $i++){
[PSCustomObject]@{
"Computer Name" = $NetBIOSNames[$i]
"Software Name" = $softwareNames[$i]
"Current Version" = $VersionNumber[$i]
"Correct Version" = $CorrectVersion[$i]
}
}
}
Итак, при работе с одним компьютером он возвращает следующее, что является желаемым результатом:
Computer Name Software Name Current Version Correct Version
------------- ------------- --------------- ---------------
ComputerOne ActivClient 7.2.1 7.2.1
Adobe Acrobat 21.001.20138 21.001.20138
ATHOC 6.2.27.271 6.2.27.271
DSET 1.6.8 1.6.8
Firefox 78.8.0 78.8.0
Google Chrome 89.0.4389.72 89.0.4389.72
Java {8.0.2710.9, 8.0.2710.9} 8.0.2710.9
McAfee Agent {5.7.1.116, 5.7.1.116} 5.7.1.116
… .Но, при работе с несколькими он возвращает следующее:
Computer Name Software Name Current Version Correct Version
------------- ------------- --------------- ---------------
ComputerOne ActivClient 7.2.1 7.2.1
ComputerTwo Adobe Acrobat 21.001.20138 21.001.20138
ATHOC 6.2.27.271 6.2.27.271
DSET 1.6.8 1.6.8
Firefox 78.8.0 78.8.0
Google Chrome 89.0.4389.72 89.0.4389.72
Java {8.0.2710.9, 8.0.2710.9} 8.0.2710.9
McAfee Agent {5.7.1.116, 5.7.1.116} 5.7.1.116
ComputerOne ActivClient 7.2.1 7.2.1
ComputerTwo Adobe Acrobat 21.001.20138 21.001.20138
ATHOC 6.2.27.271 6.2.27.271
DSET 1.6.8 1.6.8
Firefox 78.8.0 78.8.0
Google Chrome 89.0.4389.72 89.0.4389.72
Java {8.0.2710.9, 8.0.2710.9} 8.0.2710.9
McAfee Agent {5.7.1.116, 5.7.1.116} 5.7.1.116
Я хочу вернуть следующее:
Computer Name Software Name Current Version Correct Version
------------- ------------- --------------- ---------------
ComputerOne ActivClient 7.2.1 7.2.1
Adobe Acrobat 21.001.20138 21.001.20138
ATHOC 6.2.27.271 6.2.27.271
DSET 1.6.8 1.6.8
Firefox 78.8.0 78.8.0
Google Chrome 89.0.4389.72 89.0.4389.72
Java {8.0.2710.9, 8.0.2710.9} 8.0.2710.9
McAfee Agent {5.7.1.116, 5.7.1.116} 5.7.1.116
ComputerTwo ActivClient 7.2.1 7.2.1
Adobe Acrobat 21.001.20138 21.001.20138
ATHOC 6.2.27.271 6.2.27.271
DSET 1.6.8 1.6.8
Firefox 78.8.0 78.8.0
Google Chrome 89.0.4389.72 89.0.4389.72
Java {8.0.2710.9, 8.0.2710.9} 8.0.2710.9
McAfee Agent {5.7.1.116, 5.7.1.116} 5.7.1.116
Простите за длинный пост. Просто зациклился на том, что делаю неправильно. Я подумал, что так я перечисляю через свои
[PSCustomObject]
но не совсем уверен, как это сделать. У кого-нибудь есть идея или лучшее предложение о том, как это сделать?
2 ответа
Думаю, это то, что вам нужно сделать: объявить объект со свойствами и добавить его в массив
[System.Collections.ArrayList]$NetBIOSNames = @('ComputerOne','ComputerTwo')
[System.Collections.ArrayList]$softwareNames = @("ActivClient",,"Adobe Acrobat", "ATHOC", "DSET", "Firefox", "Google Chrome", "Java", "McAfee Agent")
[System.Collections.ArrayList]$VersionNumber = @()
[System.Collections.ArrayList]$CorrectVersion = @('7.2.1','21.001.20138','6.2.27.271','1.6.8','78.8.0','89.0.4389.72','8.0.2710.9','5.7.1.116')
$computerList = @()
foreach($Computer in $NetBIOSNames){
$computerObj = [PSCustomObject]@{
"Computer Name" = ""
Software = [PSCustomObject]@{
"Software Name" = ""
"Current Version" = ""
"Correct Version" = ""
}
}
for ($i = 0; $i -lt $softwareNames.Count; $i++){
$Version = Invoke-Command -ComputerName $Computer -ScriptBlock {
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.displayname -like "*$($args[0])*"}
} -ArgumentList $softwareNames[$i]
$computerObj.Software.'Software Name' = $softwareNames[$i]
$computerObj.Software.'Current Version' = $Version.DisplayVersion
$computerObj.Software.'Correct Version' = $CorrectVersion[$i]
$VersionNumber += $computerObj
}
}
При этом вам просто нужно распечатать
$VersionNumber
массив объектов, содержащих всю необходимую информацию
Это то, что я лично сделал бы, создание PSObject на удаленных серверах имеет для меня смысл. Также
Invoke-Command
к массиву компьютеров намного быстрее, чем цикл каждого компьютера.
Я должен упомянуть, что ключи хэш-таблицы должны быть точными отображаемыми именами.
$NetBIOSNames = 'ComputerOne','ComputerTwo' # I always encourage using ArrayList // GenericList but for an array of computers is not much needed.
$scriptBlock={
$regPaths=@(
'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
$softwareMap = @{
'ActivClient'='7.2.1'
'Adobe Acrobat'='21.001.20138'
'ATHOC'='6.2.27.271'
'DSET'='1.6.8'
'Firefox'='78.8.0'
'Google Chrome'='89.0.4389.72'
'Java'='8.0.2710.9'
'McAfee Agent'='5.7.1.116'
}
$itemProps = Get-ItemProperty $regPaths | Where-Object {$_.DisplayName -iin $softwareMap.Keys}
foreach($item in $itemProps)
{
$correctVersion = $softwareMap[$item.DisplayName]
[pscustomobject]@{
'Computer Name' = $env:COMPUTERNAME # Definetly reccommend populating this prop for all Objects, easier to filter in Excel :)
'Software Name' = $item.DisplayName
'Current Version' = $item.DisplayVersion -join ', '
'Correct Version' = $correctVersion
'Correct Version (Bool)' = $CorrectVersion -in $item.DisplayVersion # Using -in in case DisplayVersion is an array. Having a Bool for your Excel is also nice to have.
}
}
}
$result = Invoke-Command -ComputerName $NetBIOSNames -ScriptBlock $scriptBlock -HideComputerName
$result[0] #> Here is the PSObject of Computer 1