powershellinstalled-applications

Powershell remote installed softwares using workflow paralell


I am trying to convert my inventory script to be able to get a csv list of installed softwares on remote servers using workflows but I am not able to get it.

    $tod = Get-Date;

    $local = $PSScriptRoot +"\_Output\"+ "$((Get-Date).ToString('yyyyMMdd'))" + "\InstalledSoftwares\";

    if(!(Test-Path -Path $local ))
        {
        New-Item -ItemType Directory -Path $local
        }

        $ItemList = Import-Csv $($PSScriptRoot + "\_HostList.CFG") -Header Srv -Delimiter ";" 
        Write-Host $ItemList.srv
        workflow AllInstalledSoft {
        ForEach -Parallel ($Serv in $ItemList.srv) {
             #$Serv = $_.Srv
             if (Test-Connection -computer $Serv -count(1) -quiet)
                {
                InlineScript { Write-Host $using:Serv "Is Reachable"  -ForegroundColor  Green
                $file = $using:Serv+"_InstalledSoft"+"-{0:yyyyMMdd}.csv" -f $tod
                $ExportFile = $local+$file 
                Get-WmiObject -Class Win32_Product -PSComputerName $using:Serv | select-object @{l="HostName";e={$using:Serv}},Name,InstallDate,InstallLocation,Vendor,Version,Caption,LocalPackage,IdentifyingNumber | Export-CSV -path $ExportFile -notypeinformation}
                }
            else
                {
                InlineScript { Write-Host $using:Serv "Is UnReachable"  -ForegroundColor  Red}
                }
            }
        }
        AllInstalledSoft

Solution

  • I cannot test but try this and see if it works. Don't try with the full hostname list, just reduce it to 5 computers to test if it works.

    EDIT 3 :

    $tod =  (Get-Date).ToString('yyyyMMdd')
    
    $local = $PSScriptRoot + "\_Output\" + $tod + "\InstalledSoftwares"
    
    if(!(Test-Path -Path $local )){
        New-Item -ItemType Directory -Path $local
    }
    
    $ItemList = Import-Csv $($PSScriptRoot + "\_HostList.CFG") -Header Srv -Delimiter ";" | Select-Object -Skip 1
    
    workflow AllInstalledSoft {
        param (
            [parameter(Mandatory=$true)][array]$ItemList,
            [parameter(Mandatory=$true)][string]$LocalExport,
            [parameter(Mandatory=$true)][string]$Tod
        )
        ForEach -Parallel ($Serv in $ItemList) {
            if(Test-Connection -ComputerName $Serv -Count 1 -Quiet){
                $file = "$($Serv)_InstalledSoft-$Tod.csv"
                $ExportFile = "$LocalExport\$file"
                try {
                    Get-WmiObject -Class Win32_Product -PSComputerName $Serv -ErrorAction Stop | Select-Object PSComputerName,Name,InstallDate,InstallLocation,Vendor,Version,Caption,LocalPackage,IdentifyingNumber | Export-CSV -Path $ExportFile -NoTypeInformation
                }
                catch {}
            }
        }
    }
    AllInstalledSoft -LocalExport $local -ItemList $ItemList.Srv -Tod $tod