Добавляете разделитель для каждой запрашиваемой системы? Пользовательский объект

Мне сложно понять логику моего кода, чтобы он работал правильно. У меня есть только быстрый скрипт для получения версий программного обеспечения из удаленной системы и получения вывода в файл.

      [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
Другие вопросы по тегам