NIREN GUPTA
NIREN GUPTA

Reputation: 37

How to get the List of Installed software

I am trying to get the availability of the software on pc. My condition is that I need to fetch whether the application is installed or not on my laptop if it is installed is it in working condition?

# Setting Execution policy for the Current User
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
$currentExecutionPolicy = Get-ExecutionPolicy
Write-Output "The Execution Ploicy is set to $currentExecutionPolicy"

$programFilePath = @(
    'Google Chrome-C:\Program Files\Google\Chrome\Application\chrome.exe'
    'Brackets Text Editor-C:\Program Files (x86)\Brackets\Brackets.exe'
    'Microsoft Edge-C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
    'Microsoft Excel-C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE'
    #'Microsoft Outlook-C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE'
   
)

$result = foreach($program in $programFilePath) {
    $splitString = $program -split ('-')
    $program_name = $splitString[0]
    $program_path = $splitString[1]

    foreach($program in $program_path) {
        if (Test-Path -Path $program) {
            # Write-Output "Program Path Exists"

            $programProcess = Start-Process -FilePath $program -PassThru -ErrorAction SilentlyContinue

            timeout 5
            
            try{
                $myshell = New-Object -com "Wscript.Shell"
           $myshell.sendkeys("{ENTER}")
           timeout 1
            $myshell = New-Object -com "Wscript.Shell"
            $myshell.sendkeys("{ENTER}")
                
                
                
            }
            
            catch{
                
                 $runningProcess = Get-Process -Name $programProcess.ProcessName
                
                
            }
                      

            if($runningProcess -eq $true) {

                [pscustomobject]@{
                    Application_Name = $program_name
                    Application_Availability = 'Installed'
                    Application_Status = 'Working'                  
                }
            }
             
            else {

                [pscustomobject]@{
                    Application_Name = $program_name
                    Application_Availability = 'Installed'
                    Application_Status = 'Not Working. Error Log is generated as Application_Error_Log text file.'                  
                }

                Get-EventLog -LogName Application | Where-Object {$_.InstanceID -eq '1000'} | Tee-Object -FilePath .\Application_Error_Log.txt
                
            }
            
            <# Action to perform if the condition is true #>
        } else {

            [pscustomobject]@{
                Application_Name = $program_name
                Application_Availability = 'Not Installed'
                Application_Status = $null                                    
            }
        }
    }
}

" :: System Software Audit Report :: " | Out-File .\System_Software_Details.txt 
$result | Tee-Object -FilePath ".\System_Software_Details.txt" -Append 

timeout 60

Although I am getting the application active which are working and functional but in my output in Text file application status shows : Application_Status = 'Not Working. Error Log is generated as although my application is working fine

My second concern is I am unable to handle the application which is giving me an error

$myshell = New-Object -com "Wscript.Shell"
           $myshell.sendkeys("{ENTER}")
           timeout 1
            $myshell = New-Object -com "Wscript.Shell"
            $myshell.sendkeys("{ENTER}")

Upvotes: 0

Views: 1014

Answers (3)

js2010
js2010

Reputation: 27423

There's always get-package.

$list = '*chrome*','*firefox*','*notepad++*'
$list | % { get-package $_ }


Name                           Version          Source            ProviderName
----                           -------          ------            ------------
Google Chrome                  104.0.5112.102                     msi
Mozilla Firefox (x64 en-US)    104.0.1                            Programs
Notepad++ (64-bit x64)         7.8.9                              msi

Faster as an argument list and no wildcards:

get-package 'google chrome','mozilla firefox (x64 en-us)',
  'notepad++ (64-bit x64)'

Or with the threadjob module:

$list = '*chrome*','*firefox*','*notepad++*'
$list | % { start-threadjob { get-package $using:_ } } | 
  receive-job -wait -auto

Upvotes: 0

LosManos
LosManos

Reputation: 7692

$runningProcess -eq $true doesn't necessarily work as $runningProcess is not a boolean but an object. Alas it always returns false.

TL;DR

If you look at your code you see that to get to "...Not Working..." you have to evaluate ($runningProcess -eq $true). Ergo it returns false.

Upvotes: 0

Toni
Toni

Reputation: 1816

I think checking filesystem paths is an option but a bad one - you cannot ensure in any case that the expected path is used. Checking the filesystem is only necessary for portable applications.

A better approach is to check the following registry keys, by doing so you get the same result as it is displayed under add/remove programs:

HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -Name DisplayName,DisplayVersion,InstallSource,Publisher,UninstallString

Another way is to query wmi/cim:

Get-CimInstance -query "select * from win32_product"

But by doing so you generate foreach discovered software product an event in the windows event log (Log: Application, Source: MSIInstaller).

To verify if you can start successfully an application by using start-process you need also to specify the parameter -wait and then check if the return code is 0.

Upvotes: 1

Related Questions