function Get-ApplicationInventory { <# .SYNOPSIS Returns an OrderedDictionary that Represents the Application Inventory. #> [CmdletBinding()] Param() $logLead = (Get-LogLeadName); $providerStopWatch = [System.Diagnostics.StopWatch]::StartNew() $applicationDictionary = New-Object System.Collections.Specialized.OrderedDictionary $applicationDetails = New-Object System.Collections.Specialized.OrderedDictionary try { Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Reading App Uninstall Details" $uninstallDetails = Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : App Uninstall Details Retrieved" foreach ($app in $uninstallDetails) { $appName = $app | Select-Object -ExpandProperty PSChildName $applicationDetails[$appName] = New-Object System.Collections.Specialized.OrderedDictionary $applicationDetails[$appName]["Name"] = $app.DisplayName $applicationDetails[$appName]["Version"] = $app.DisplayVersion $applicationDetails[$appName]["Publisher"] = $app.Publisher $applicationDetails[$appName]["InstallDate"] = $app.InstallDate $applicationDetails[$appName]["UninstallString"] = $app.UninstallString } } catch { $applicationDetails["Error"] = $_.Exception.ToString() } $applicationDictionary.Add("Software", $applicationDetails) Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Provider Complete" $providerStopWatch.Stop() return $applicationDictionary }