Get-InstalledSoftware

Aus Wiki-WebPerfect
Wechseln zu: Navigation, Suche

-> This function/script is moved to GitHub!

filter Get-InstalledSoftware {
    <#
    .SYNOPSIS
        Get all installed from the Uninstall keys in the registry.
    .DESCRIPTION
        Read a list of installed software from each Uninstall key.
        This function provides an alternative to using Win32_Product.
    .EXAMPLE
        Get-InstalledSoftware
        Get the list of installed applications from the local computer.
    .EXAMPLE
        Get-InstalledSoftware -IncludeLoadedUserHives
        Get the list of installed applications from the local computer, including each loaded user hive.
    .EXAMPLE
        Get-InstalledSoftware -ComputerName None -DebugConnection
        Display all error messages thrown when attempting to audit the specified computer.
    .EXAMPLE
        Get-InstalledSoftware -IncludeBlankNames
        Display all results, including those with very limited information.
    #>
 
    [CmdletBinding()]
    [OutputType([PSObject])]
    param (
        # The computer to execute against. By default, Get-InstalledSoftware reads registry keys on the local computer.
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [String]$ComputerName = $env:COMPUTERNAME,
 
        # Attempt to start the remote registry service if it is not already running. This parameter will only take effect if the service is not disabled.
        [Switch]$StartRemoteRegistry,
 
        # Some software packages, such as DropBox install into a users profile rather than into shared areas. Get-InstalledSoftware can increase the search to include each loaded user hive.
        #
        # If a registry hive is not loaded it cannot be searched, this is a limitation of this search style.
        [Switch]$IncludeLoadedUserHives,
 
        # By default Get-InstalledSoftware will suppress the display of entries with minimal information. If no DisplayName is set it will be hidden from view. This behaviour may be changed using this parameter.
        [Switch]$IncludeBlankNames
    )
 
    $keys = 'Software\Microsoft\Windows\CurrentVersion\Uninstall',
            'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
 
    # If the remote registry service is stopped before this script runs it will be stopped again afterwards.
    if ($StartRemoteRegistry) {
        $shouldStop = $false
        $service = Get-Service RemoteRegistry -Computer $ComputerName
 
        if ($service.Status -eq 'Stopped' -and $service.StartType -ne 'Disabled') {
            $shouldStop = $true
            $service | Start-Service
        }
    }
 
    $baseKeys = [System.Collections.Generic.List[Microsoft.Win32.RegistryKey]]::new()
 
    $baseKeys.Add([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $ComputerName, 'Registry64'))
    if ($IncludeLoadedUserHives) {
        try {
            $baseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', $ComputerName, 'Registry64')
            foreach ($name in $baseKey.GetSubKeyNames()) {
                if (-not $name.EndsWith('_Classes')) {
                    Write-Debug ('Opening {0}' -f $name)
 
                    try {
                        $baseKeys.Add($baseKey.OpenSubKey($name, $false))
                    } catch {
                        $errorRecord = [System.Management.Automation.ErrorRecord]::new(
                            $_.Exception.GetType()::new(
                                ('Unable to access sub key {0} ({1})' -f $name, $_.Exception.InnerException.Message.Trim()),
                                $_.Exception
                            ),
                            'SubkeyAccessError',
                            'InvalidOperation',
                            $name
                        )
                        Write-Error -ErrorRecord $errorRecord
                    }
                }
            }
        } catch [Exception] {
            Write-Error -ErrorRecord $_
        }
    }
 
    foreach ($baseKey in $baseKeys) {
        Write-Verbose ('Reading {0}' -f $baseKey.Name)
 
        if ($basekey.Name -eq 'HKEY_LOCAL_MACHINE') {
            $username = 'LocalMachine'
        } else {
            # Attempt to resolve a SID
            try {
                [System.Security.Principal.SecurityIdentifier]$sid = Split-Path $baseKey.Name -Leaf
                $username = $sid.Translate([System.Security.Principal.NTAccount]).Value
            } catch {
                $username = Split-Path $baseKey.Name -Leaf
            }
        }
 
        foreach ($key in $keys) {
            try {
                $uninstallKey = $baseKey.OpenSubKey($key, $false)
 
                if ($uninstallKey) {
                    $is64Bit = $true
                    if ($key -match 'Wow6432Node') {
                        $is64Bit = $false
                    }
 
                    foreach ($name in $uninstallKey.GetSubKeyNames()) {
                        $packageKey = $uninstallKey.OpenSubKey($name)
 
                        $installDate = Get-Date
                        $dateString = $packageKey.GetValue('InstallDate')
                        if (-not $dateString -or -not [DateTime]::TryParseExact($dateString, 'yyyyMMdd', (Get-Culture), 'None', [Ref]$installDate)) {
                            $installDate = $null
                        }
 
                        [PSCustomObject]@{
                            Name            = $name
                            DisplayName     = $packageKey.GetValue('DisplayName')
                            DisplayVersion  = $packageKey.GetValue('DisplayVersion')
                            InstallDate     = $installDate
                            InstallLocation = $packageKey.GetValue('InstallLocation')
                            HelpLink        = $packageKey.GetValue('HelpLink')
                            Publisher       = $packageKey.GetValue('Publisher')
                            UninstallString = $packageKey.GetValue('UninstallString')
                            URLInfoAbout    = $packageKey.GetValue('URLInfoAbout')
                            Is64Bit         = $is64Bit
                            Hive            = $baseKey.Name
                            Path            = Join-Path $key $name
                            Username        = $username
                            ComputerName    = $ComputerName
                        }
                    }
                }
            } catch {
                Write-Error -ErrorRecord $_
            }
        }
    }
 
    # Stop the remote registry service if required  
    if ($StartRemoteRegistry -and $shouldStop) {
        $service | Stop-Service
    }
}



Source: https://www.indented.co.uk/get-installedsoftware/