140 lines
5.4 KiB
PowerShell
140 lines
5.4 KiB
PowerShell
Function Get-RemoteProgram {
|
|
<#
|
|
.Synopsis
|
|
Generates a list of installed programs on a computer
|
|
|
|
.DESCRIPTION
|
|
This function generates a list by querying the registry and returning the installed programs of a local or remote computer.
|
|
|
|
.NOTES
|
|
Name : Get-RemoteProgram
|
|
Author : Jaap Brasser
|
|
Version : 1.3
|
|
DateCreated: 2013-08-23
|
|
DateUpdated: 2016-08-26
|
|
Blog : http://www.jaapbrasser.com
|
|
|
|
.LINK
|
|
http://www.jaapbrasser.com
|
|
|
|
.PARAMETER ComputerName
|
|
The computer to which connectivity will be checked
|
|
|
|
.PARAMETER Property
|
|
Additional values to be loaded from the registry. Can contain a string or an array of string that will be attempted to retrieve from the registry for each program entry
|
|
|
|
.PARAMETER ExcludeSimilar
|
|
This will filter out similar programnames, the default value is to filter on the first 3 words in a program name. If a program only consists of less words it is excluded and it will not be filtered. For example if you Visual Studio 2015 installed it will list all the components individually, using -ExcludeSimilar will only display the first entry.
|
|
|
|
.PARAMETER SimilarWord
|
|
This parameter only works when ExcludeSimilar is specified, it changes the default of first 3 words to any desired value.
|
|
|
|
.EXAMPLE
|
|
Get-RemoteProgram
|
|
|
|
Description:
|
|
Will generate a list of installed programs on local machine
|
|
|
|
.EXAMPLE
|
|
Get-RemoteProgram -ComputerName server01,server02
|
|
|
|
Description:
|
|
Will generate a list of installed programs on server01 and server02
|
|
|
|
.EXAMPLE
|
|
Get-RemoteProgram -ComputerName Server01 -Property DisplayVersion,VersionMajor
|
|
|
|
Description:
|
|
Will gather the list of programs from Server01 and attempts to retrieve the displayversion and versionmajor subkeys from the registry for each installed program
|
|
|
|
.EXAMPLE
|
|
'server01','server02' | Get-RemoteProgram -Property Uninstallstring
|
|
|
|
Description
|
|
Will retrieve the installed programs on server01/02 that are passed on to the function through the pipeline and also retrieves the uninstall string for each program
|
|
|
|
.EXAMPLE
|
|
'server01','server02' | Get-RemoteProgram -Property Uninstallstring -ExcludeSimilar -SimilarWord 4
|
|
|
|
Description
|
|
Will retrieve the installed programs on server01/02 that are passed on to the function through the pipeline and also retrieves the uninstall string for each program. Will only display a single entry of a program of which the first four words are identical.
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess=$true)]
|
|
param(
|
|
[Parameter(ValueFromPipeline =$true,
|
|
ValueFromPipelineByPropertyName=$true,
|
|
Position=0
|
|
)]
|
|
[string[]]
|
|
$ComputerName = $env:COMPUTERNAME,
|
|
[Parameter(Position=0)]
|
|
[string[]]
|
|
$Property,
|
|
[switch]
|
|
$ExcludeSimilar,
|
|
[int]
|
|
$SimilarWord
|
|
)
|
|
|
|
begin {
|
|
$RegistryLocation = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\',
|
|
'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'
|
|
$HashProperty = @{}
|
|
$SelectProperty = @('ProgramName','ComputerName')
|
|
if ($Property) {
|
|
$SelectProperty += $Property
|
|
}
|
|
}
|
|
|
|
process {
|
|
foreach ($Computer in $ComputerName) {
|
|
$RegBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Computer)
|
|
$RegistryLocation | ForEach-Object {
|
|
$CurrentReg = $_
|
|
if ($RegBase) {
|
|
$CurrentRegKey = $RegBase.OpenSubKey($CurrentReg)
|
|
if ($CurrentRegKey) {
|
|
$CurrentRegKey.GetSubKeyNames() | ForEach-Object {
|
|
if ($Property) {
|
|
foreach ($CurrentProperty in $Property) {
|
|
$HashProperty.$CurrentProperty = ($RegBase.OpenSubKey("$CurrentReg$_")).GetValue($CurrentProperty)
|
|
}
|
|
}
|
|
$HashProperty.ComputerName = $Computer
|
|
$HashProperty.ProgramName = ($DisplayName = ($RegBase.OpenSubKey("$CurrentReg$_")).GetValue('DisplayName'))
|
|
if ($DisplayName) {
|
|
New-Object -TypeName PSCustomObject -Property $HashProperty |
|
|
Select-Object -Property $SelectProperty
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} | ForEach-Object -Begin {
|
|
if ($SimilarWord) {
|
|
$Regex = [regex]"(^(.+?\s){$SimilarWord}).*$|(.*)"
|
|
} else {
|
|
$Regex = [regex]"(^(.+?\s){3}).*$|(.*)"
|
|
}
|
|
[System.Collections.ArrayList]$Array = @()
|
|
} -Process {
|
|
if ($ExcludeSimilar) {
|
|
$null = $Array.Add($_)
|
|
} else {
|
|
$_
|
|
}
|
|
} -End {
|
|
if ($ExcludeSimilar) {
|
|
$Array | Select-Object -Property *,@{
|
|
name = 'GroupedName'
|
|
expression = {
|
|
($_.ProgramName -split $Regex)[1]
|
|
}
|
|
} |
|
|
Group-Object -Property 'GroupedName' | ForEach-Object {
|
|
$_.Group[0] | Select-Object -Property * -ExcludeProperty GroupedName
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |