Home > OS >  How to get the List of Installed software
How to get the List of Installed software

Time:09-02

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}")

CodePudding user response:

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.

CodePudding user response:

$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.

  • Related