moved specific functions from Tools.ps1 to Get-InstalledSoftware.ps1
added additional processing features
This commit is contained in:
+83
-39
@@ -4,50 +4,94 @@ $FILE = "${Env:UserProfile}\Desktop\InstalledSoftware.csv"
|
|||||||
## Clear content of output file
|
## Clear content of output file
|
||||||
If ( Test-Path $FILE ) { Clear-Content -Path $FILE -Force }
|
If ( Test-Path $FILE ) { Clear-Content -Path $FILE -Force }
|
||||||
|
|
||||||
|
## Function to append a line to a file
|
||||||
|
Function Write-LineToFile {
|
||||||
|
param([Parameter(Mandatory=$true)][string]$Path,[Parameter(Mandatory=$true)][string]$Line)
|
||||||
|
If ( -not (Test-Path $Path) ) {
|
||||||
|
LogMsg "Creating file ""${Path}"""
|
||||||
|
Try { New-Item -Path $Path -ItemType File -Force | Out-Null }
|
||||||
|
Catch { LogErr $_.Exception.Message }
|
||||||
|
}
|
||||||
|
Try { Add-Content -Path $Path -Value $Line }
|
||||||
|
Catch { LogErr $_.Exception.Message }
|
||||||
|
}
|
||||||
|
|
||||||
|
## Function to test whether or not an item has a specified property
|
||||||
|
Function Test-ItemProperty {
|
||||||
|
param([Parameter(Mandatory=$true)][string]$Path,[Parameter(Mandatory=$true)][string]$Name)
|
||||||
|
Try {
|
||||||
|
$test = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
|
||||||
|
If (($test -eq $null) -or ($test.Length -eq 0)) { Return $false } Else { Return $true }
|
||||||
|
}
|
||||||
|
Catch { Return $false }
|
||||||
|
}
|
||||||
|
|
||||||
|
## Function to retrieve an item property
|
||||||
|
Function Get-ItemPropertyInfo {
|
||||||
|
param([Parameter(Mandatory=$true)][string]$Path,[Parameter(Mandatory=$true)][string]$Name)
|
||||||
|
If ( Test-ItemProperty -Path $Path -Name $Name ) {
|
||||||
|
$retval = Get-ItemPropertyValue -Path $Path -Name $Name
|
||||||
|
$retval = $retval -replace ",", " "
|
||||||
|
|
||||||
|
## Additional processing for specific properties
|
||||||
|
Switch ( $Name ) {
|
||||||
|
|
||||||
|
## Convert the estimated size into MB
|
||||||
|
"EstimatedSize" {
|
||||||
|
$size = [int]$retval
|
||||||
|
$size = [Math]::Ceiling($size / 1024)
|
||||||
|
$retval = [string]$size
|
||||||
|
}
|
||||||
|
|
||||||
|
## Convert the date format into YYYY-MM-DD
|
||||||
|
"InstallDate" {
|
||||||
|
|
||||||
|
$origRetval = $retval
|
||||||
|
|
||||||
|
## Try to find each type of date string so we can convert it
|
||||||
|
Switch -Regex ( $retval ) {
|
||||||
|
'^\d{8}$' { $formatstring = 'yyyyMMdd' }
|
||||||
|
'^\d{1,2}\\\d{1,2}\\\d{4}$' { $formatstring = 'MM\dd\yyyy' }
|
||||||
|
'^\d{4}\\\d{1,2}\\\d{1,2}$' { $formatstring = 'yyyy\MM\dd' }
|
||||||
|
Default { $formatstring = $null }
|
||||||
|
}
|
||||||
|
|
||||||
|
## Make sure $formatstring has a value, if not just try to cast directly to a datetime
|
||||||
|
Try {
|
||||||
|
If ( $formatstring -eq $null ) {
|
||||||
|
$date = [datetime]$retval
|
||||||
|
} Else {
|
||||||
|
$date = [datetime]::ParseExact($retval,$formatstring,$null)
|
||||||
|
}
|
||||||
|
|
||||||
|
## Set $retval to a standard datetime format
|
||||||
|
$retval = $date.ToString('yyyy-MM-dd')
|
||||||
|
}
|
||||||
|
Catch { LogErr $_.Exception.Message; $retval = $origRetval }
|
||||||
|
}
|
||||||
|
Default {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Else { $retval = "" }
|
||||||
|
|
||||||
|
Return $retval
|
||||||
|
}
|
||||||
|
|
||||||
## Write the headers to the output file
|
## Write the headers to the output file
|
||||||
Write-LineToFile -Path $FILE -Line "Name,Publisher,Version,InstallDate,EstimatedSize(MB),UninstallString,ModifyPath"
|
Write-LineToFile -Path $FILE -Line "Name,Publisher,Version,InstallDate,EstimatedSize(MB),UninstallString,ModifyPath"
|
||||||
|
|
||||||
|
## Iterate through all Registry Uninstall keys and build the CSV file of all installed software
|
||||||
ForEach ( $item in $(Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') ) {
|
ForEach ( $item in $(Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') ) {
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name DisplayName ) {
|
$DisplayName = Get-ItemPropertyInfo -Path $item.PSPath -Name DisplayName
|
||||||
$DisplayName = Get-ItemPropertyValue -Path $item.PSPath -Name DisplayName
|
$DisplayVersion = Get-ItemPropertyInfo -Path $item.PSPath -Name DisplayVersion
|
||||||
$DisplayName = $DisplayName -replace ",", " "
|
$EstimatedSize = Get-ItemPropertyInfo -Path $item.PSPath -Name EstimatedSize
|
||||||
} Else { $DisplayName = "" }
|
$InstallDate = Get-ItemPropertyInfo -Path $item.PSPath -Name InstallDate
|
||||||
|
$Publisher = Get-ItemPropertyInfo -Path $item.PSPath -Name Publisher
|
||||||
|
$UninstallString = Get-ItemPropertyInfo -Path $item.PSPath -Name UninstallString
|
||||||
|
$ModifyPath = Get-ItemPropertyInfo -Path $item.PSPath -Name ModifyPath
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name DisplayVersion ) {
|
## Write installed software to output file only if it has a name and uninstall/modify path, otherwise discard
|
||||||
$DisplayVersion = Get-ItemPropertyValue -Path $item.PSPath -Name DisplayVersion
|
If ( -not (($DisplayName -eq "") -and ($UninstallString -eq "") -and ($ModifyPath -eq "")) ) {
|
||||||
$DisplayVersion = $DisplayVersion -replace ",", " "
|
|
||||||
} Else { $DisplayVersion = "" }
|
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name EstimatedSize ) {
|
|
||||||
$EstimatedSize = Get-ItemPropertyValue -Path $item.PSPath -Name EstimatedSize
|
|
||||||
$EstimatedSize = $EstimatedSize -replace ",", " "
|
|
||||||
$size = [int]$EstimatedSize
|
|
||||||
$size = [Math]::Ceiling($size / 1024)
|
|
||||||
$EstimatedSize = [string]$size
|
|
||||||
} Else { $EstimatedSize = "" }
|
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name InstallDate ) {
|
|
||||||
$InstallDate = Get-ItemPropertyValue -Path $item.PSPath -Name InstallDate
|
|
||||||
$InstallDate = $InstallDate -replace ",", " "
|
|
||||||
} Else { $InstallDate = "" }
|
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name Publisher ) {
|
|
||||||
$Publisher = Get-ItemPropertyValue -Path $item.PSPath -Name Publisher
|
|
||||||
$Publisher = $Publisher -replace ",", " "
|
|
||||||
} Else { $Publisher = "" }
|
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name UninstallString ) {
|
|
||||||
$UninstallString = Get-ItemPropertyValue -Path $item.PSPath -Name UninstallString
|
|
||||||
$UninstallString = $UninstallString -replace ",", " "
|
|
||||||
} Else { $UninstallString = "" }
|
|
||||||
|
|
||||||
If ( Test-ItemProperty -Path $item.PSPath -Name ModifyPath ) {
|
|
||||||
$ModifyPath = Get-ItemPropertyValue -Path $item.PSPath -Name ModifyPath
|
|
||||||
$ModifyPath = $ModifyPath -replace ",", " "
|
|
||||||
} Else { $ModifyPath = "" }
|
|
||||||
|
|
||||||
## Write installed software to output file only if it has a name, otherwise discard
|
|
||||||
If ( $DisplayName -ne "" ) {
|
|
||||||
$content = "${DisplayName},${Publisher},${DisplayVersion},${InstallDate},${EstimatedSize},${UninstallString},${ModifyPath}"
|
$content = "${DisplayName},${Publisher},${DisplayVersion},${InstallDate},${EstimatedSize},${UninstallString},${ModifyPath}"
|
||||||
Write-LineToFile -Path $FILE -Line $content
|
Write-LineToFile -Path $FILE -Line $content
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,28 +41,6 @@ Function LogErr {
|
|||||||
Add-Content -Path $LogFile -Value $LogEntry
|
Add-Content -Path $LogFile -Value $LogEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function to append a line to a file
|
|
||||||
Function Write-LineToFile {
|
|
||||||
param([Parameter(Mandatory=$true)][string]$Path,[Parameter(Mandatory=$true)][string]$Line)
|
|
||||||
If ( -not (Test-Path $Path) ) {
|
|
||||||
LogMsg "Creating file ""${Path}"""
|
|
||||||
Try { New-Item -Path $Path -ItemType File -Force | Out-Null }
|
|
||||||
Catch { LogErr $_.Exception.Message }
|
|
||||||
}
|
|
||||||
Try { Add-Content -Path $Path -Value $Line }
|
|
||||||
Catch { LogErr $_.Exception.Message }
|
|
||||||
}
|
|
||||||
|
|
||||||
## Function to test whether or not an item has a specified property
|
|
||||||
Function Test-ItemProperty {
|
|
||||||
param([Parameter(Mandatory=$true)][string]$Path,[Parameter(Mandatory=$true)][string]$Name)
|
|
||||||
Try {
|
|
||||||
$test = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
|
|
||||||
If (($test -eq $null) -or ($test.Length -eq 0)) { Return $false } Else { Return $true }
|
|
||||||
}
|
|
||||||
Catch { Return $false }
|
|
||||||
}
|
|
||||||
|
|
||||||
## Function to determine if the current user context is an Administrator
|
## Function to determine if the current user context is an Administrator
|
||||||
Function IsAdmin {
|
Function IsAdmin {
|
||||||
If ( ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) )
|
If ( ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) )
|
||||||
|
|||||||
Reference in New Issue
Block a user