Public/Get-InstalledSoftware.ps1

Function Get-InstalledSoftware {
   Param([String[]]$Computers)
   If (!$Computers) { $Computers = $ENV:ComputerName }
   $Base = New-Object PSObject;
   $Base | Add-Member Noteproperty ComputerName -Value $Null;
   $Base | Add-Member Noteproperty Name -Value $Null;
   $Base | Add-Member Noteproperty Publisher -Value $Null;
   $Base | Add-Member Noteproperty InstallDate -Value $Null;
   $Base | Add-Member Noteproperty EstimatedSize -Value $Null;
   $Base | Add-Member Noteproperty Version -Value $Null;
   $Base | Add-Member Noteproperty Wow6432Node -Value $Null;
   $Results = New-Object System.Collections.Generic.List[System.Object];
   
   foreach ($ComputerName in $Computers) {
      $Registry = $Null;
      Try { $Registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $ComputerName); }
      Catch { Write-Host -ForegroundColor Red "$($_.Exception.Message)"; }
      
      If ($Registry) {
         $UninstallKeys = $Null;
         $SubKey = $Null;
         $UninstallKeys = $Registry.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Uninstall", $False);
         $UninstallKeys.GetSubKeyNames() | ForEach-Object {
            $SubKey = $UninstallKeys.OpenSubKey($_, $False);
            $DisplayName = $SubKey.GetValue("DisplayName");
            If ($DisplayName.Length -gt 0) {
               $Entry = $Base | Select-Object *
               $Entry.ComputerName = $ComputerName;
               $Entry.Name = $DisplayName.Trim();
               $Entry.Publisher = $SubKey.GetValue("Publisher");
               [ref]$ParsedInstallDate = Get-Date
               If ([DateTime]::TryParseExact($SubKey.GetValue("InstallDate"), "yyyyMMdd", $Null, [System.Globalization.DateTimeStyles]::None, $ParsedInstallDate)) {
                  $Entry.InstallDate = $ParsedInstallDate.Value
               }
               $Entry.EstimatedSize = [Math]::Round($SubKey.GetValue("EstimatedSize")/1KB, 1);
               $Entry.Version = $SubKey.GetValue("DisplayVersion");
               [Void]$Results.Add($Entry);
            }
         }
         
         If ([IntPtr]::Size -eq 8) {
            $UninstallKeysWow6432Node = $Null;
            $SubKeyWow6432Node = $Null;
            $UninstallKeysWow6432Node = $Registry.OpenSubKey("Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", $False);
            If ($UninstallKeysWow6432Node) {
               $UninstallKeysWow6432Node.GetSubKeyNames() | ForEach-Object {
                  $SubKeyWow6432Node = $UninstallKeysWow6432Node.OpenSubKey($_, $False);
                  $DisplayName = $SubKeyWow6432Node.GetValue("DisplayName");
                  If ($DisplayName.Length -gt 0) {
                     $Entry = $Base | Select-Object *
                     $Entry.ComputerName = $ComputerName;
                     $Entry.Name = $DisplayName.Trim();
                     $Entry.Publisher = $SubKeyWow6432Node.GetValue("Publisher");
                     [ref]$ParsedInstallDate = Get-Date
                     If ([DateTime]::TryParseExact($SubKeyWow6432Node.GetValue("InstallDate"), "yyyyMMdd", $Null, [System.Globalization.DateTimeStyles]::None, $ParsedInstallDate)) {
                        $Entry.InstallDate = $ParsedInstallDate.Value
                     }
                     $Entry.EstimatedSize = [Math]::Round($SubKeyWow6432Node.GetValue("EstimatedSize")/1KB, 1);
                     $Entry.Version = $SubKeyWow6432Node.GetValue("DisplayVersion");
                     $Entry.Wow6432Node = $True;
                     [Void]$Results.Add($Entry);
                  }
               }
            }
         }
      }
   }
   $Results
}