Powershell script cannot get applications list data from windows 7 machine

Recently, I made a script to list all the installed applications in local & remote machine & give the output in a structured manner in an excelsheet.

It looks like this:

$a = Read-Host "Enter machine name" | Out-File -filepath C:\machine.txt
$computerName = Get-Content C:\machine.txt 
$a = New-Object -comobject Excel.Application
$a.visible = $True

$b = $a.Workbooks.Add()
$c = $b.Worksheets.Item(1)

$c.Cells.Item(1,1) = "Name"
$c.Cells.Item(1,2) = "Publisher"
$c.Cells.Item(1,3) = "InstalledDate"
$c.Cells.Item(1,4) = "Version"
$c.Cells.Item(1,5) = "UninstallString"

$d = $c.UsedRange
$d.Interior.ColorIndex = 19
$d.Font.ColorIndex = 11
$d.Font.Bold = $True

$i = 2
function Get-InstalledAppReg ([string]$ComputerName) {

  $RegPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  $BaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $ComputerName)
  $OpenSubKey = $BaseKey.OpenSubKey($RegPath)
$i =2
  $OpenSubKey.GetSubKeyNames() | ForEach {
    $Path = "$RegPath\$_"
    $BaseKey.OpenSubKey($Path).GetValue("DisplayName")
      $BaseKey.OpenSubKey($Path).GetValue("Publisher")
      $BaseKey.OpenSubKey($Path).GetValue("InstalledDate")
      $BaseKey.OpenSubKey($Path).GetValue("Version")
      $BaseKey.OpenSubKey($Path).GetValue("UninstallString")
$c.Cells.Item($i,1) = $BaseKey.OpenSubKey($Path).GetValue("DisplayName")
$c.Cells.Item($i,2) = $BaseKey.OpenSubKey($Path).GetValue("Publisher")
$c.Cells.Item($i,3) = $BaseKey.OpenSubKey($Path).GetValue("InstalledDate")
$c.Cells.Item($i,4) = $BaseKey.OpenSubKey($Path).GetValue("Version")
$c.Cells.Item($i,5) = $BaseKey.OpenSubKey($Path).GetValue("UninstallString")
$i ++
  }
}
Get-InstalledAppReg($computerName)

$d.EntireColumn.AutoFit()
$b.SaveAs("c:\softhive.xlsx")
$b.Close()
$a.Quit()
Get-Process | Where { $_.Name -Eq "Excel" } | Kill

This script ran perfectly for all remote machines which has XP as a OS.

Problem started when I started running it in windows & machines remotely.

Initially it gave wrong path error, when I realized that for windows 7, I probably have to use

"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" instead of

"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall".

With this different path, when I run the same script again, I get an error:

Exception calling "OpenRemoteBaseKey" with "2" argument(s): "The network path was not found.

"

At :line:24 char:62

  • $BaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey( <<<< "LocalMachine", $ComputerName)

Probably, I need to change other things too in the script? My machine, from where I run the script, is a windows XP SP3 machine.

Answers


Unfortunately the WMI Win32_Product class does not report all apps found in Control Panel's "Add or Remove Programs"...

The registry walk seems to be unavoidable, see: http://powergui.org/thread.jspa?threadID=17068 http://learningpcs.blogspot.fr/2011/10/powershell-get-installed-software.html


Rather than comb the registry, I would use WMI for this. See Win32_Product and friends e.g.:

Get-WmiObject Win32_Product

Note that if I run this on my Windows 7 x64 system in a 64bit PowerShell prompt it shows all installed apps (32-bit and 64-bit):

Get-WmiObject Win32_Product| sort Vendor | Format-Table Name,InstallDate,Vendor

To see all the properties available execute:

Get-WmiObject Win32_Product | Select -First 1 | Format-List *

I remember a while back I did something like this at an IT firm and we simply searched the C: directory for the names of all programs ending in .exe, in order to optimize we would hone in on specific apps that we were looking for. We set up a batch that would pass or fail based on if what we wanted. Keep in mind this is a batch file, however the idea is similar.

echo ================= >>Software_Scan.txt
echo Below is a list of all wireless networks. Saved networks will be found in the Wireless Profiles folder 
set filePath=
for /R "C:\Program Files (x86)" /D %%a in (*) do if exist "%%a\YahooMessenger.exe" set filePath=%%a& goto continue
:continue
if defined filePath echo %COMPUTERNAME% FAIL Yahoo Messenger >> Software_Scan.txt
if NOT defined filePath echo %COMPUTERNAME% PASS Yahoo Messenger >> Software_Scan.txt

Need Your Help

.NET Reflection - Finding the type that defines a static member

.net reflection system.reflection

I have a problem with reflection. I need to find the type that instantiates a static member. My code looks like this:

What is the simplest way to define a local variable in Oracle?

oracle variables plsql

In the SQL Server, I can define local variables like this.