2013-10-22 151 views
0

我將在遠程服務器上託管一個文件(只讀)並要求用戶在其機器上運行該文件以收集已安裝的程序信息。我希望將文件保存到他們的用戶空間的桌面,以便我可以讓他們發送給我們。PowerShell獲取已安裝的程序

我有劇本,但我不管理,以獲得來自 「SOFTWARE \微軟\的Windows \ CurrentVersion \卸載」 的信息, 「SOFTWARE \ Wow6432Node \微軟\的Windows \ CurrentVersion \卸載」在同一個輸出文件中。我明顯錯過了一些固有的顯而易見的東西,因爲PowerShell顯然能夠做到這一點,並且我要求有人請將我從PEBKAC問題中解救出來!

預先感謝您,感謝!

這是我的代碼;

$computers = "$env:computername" 

$array = @() 

foreach($pc in $computers){ 

$computername=$pc 

$UninstallKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" 
$UninstallKey="Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 

$reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername) 

$regkey=$reg.OpenSubKey($UninstallKey) 

$subkeys=$regkey.GetSubKeyNames() 

Write-Host "$computername" 
foreach($key in $subkeys){ 

    $thisKey=$UninstallKey+"\\"+$key 

    $thisSubKey=$reg.OpenSubKey($thisKey) 

    $obj = New-Object PSObject 

    $obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computername 

    $obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value $($thisSubKey.GetValue("DisplayName")) 

    $obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value $($thisSubKey.GetValue("DisplayVersion")) 

    $obj | Add-Member -MemberType NoteProperty -Name "InstallLocation" -Value $($thisSubKey.GetValue("InstallLocation")) 

    $obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value $($thisSubKey.GetValue("Publisher")) 

    $array += $obj 

    } 

} 

$array | Where-Object { $_.DisplayName } | select ComputerName, DisplayName, DisplayVersion, Publisher | export-csv C:\Users\$env:username\Desktop\Installed_Apps.csv 
+1

當然,這假定用戶不必運行一個'powershell set-executionpolicy'無限制'之前。 您可能知道我是PowerShell的新手! – CriticalPoint

回答

1

眼下下面兩行設置相同的變量:

$UninstallKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" 
$UninstallKey="Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 

使用此:

$UninstallKey = @(
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 
    'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' 
) 

然後包裹真正的邏輯:

$UninstallKey | ForEach-Object { 
    $regkey=$reg.OpenSubKey($_) 

    # the rest of your logic here 
} 
+1

爲什麼'ForEach-Object'而不是'foreach(stuff)',你可能會問......這是個人偏好:'ForEach-Object'繼續一個流水線並且可以異步處理; 'foreach(stuff)'是老派,必須在構造迭代器之前收集所有對象。 – Eris

相關問題