列出远程服务器上安装的应用

时间:2014-02-21 22:59:03

标签: powershell

我拼凑了以下脚本,该脚本列出了本地系统上所有已安装的应用程序并将其写入日志文件,但我不知道如何在使用PSRemoteRegistry时获得相同的输出,我需要的实际输入列表将是所有远程目标。

是否有人有将相同代码插入PSRemoteRegistry可用cmdlet的经验?具体来说,我需要它来枚举在HKLM键中找到的每个已安装应用程序的显示名称:\ Software \ Microsoft \ CurrentVersion \ Uninstall

我需要帮助进入PSRemoteRegistry cmdlet:

Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object {Log (Get-ItemProperty $_.pspath).DisplayName}

这是整个脚本:

    clear
    #$ErrorActionPreference = "silentlycontinue"

    $Logfile = "C:\temp\installed_apps.log"

    Function Log
    {
        param([string]$logstring)

        Add-Content $Logfile -Value $logstring
    }

    $target_list = Get-Content -Path c:\temp\installed_apps_targets.txt

    foreach ($system in $target_list){

        if (test-connection $system -quiet) 
        {
           Log "---------------Begin $system---------------"
           Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object {Log (Get-ItemProperty $_.pspath).DisplayName}
           Log "---------------End $system---------------"
        }
        else 
        {
            Log "**************$system was unreachable**************"
        }

}

2 个答案:

答案 0 :(得分:1)

你可以适应这样的事情:

$Computer = "ComputerName"

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)
$RegKey= $Reg.OpenSubKey('Software\Microsoft\Windows\CurrentVersion\Uninstall')

$Keys = $RegKey.GetSubKeyNames()

$Keys | ForEach-Object {
   $Subkey = $RegKey.OpenSubKey("$_")
   Write-Host $Subkey.GetValue('DisplayName')
}

答案 1 :(得分:1)

你见过Invoke-Command吗?

$Logfile = "C:\temp\installed_apps.log"

Function Log() {
    param([string]$logstring)

    Add-Content $Logfile -Value $logstring
}

$scriptbock = {Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object {Log (Get-ItemProperty $_.pspath).DisplayName}}

Get-Content -Path c:\temp\installed_apps_targets.txt | % {
    if (test-connection $_ -quiet) {
       Log "---------------Begin $system---------------"
       Log $(Invoke-Command -ComputerName $_ -ScriptBlock $scriptblock)
       Log "---------------End $system---------------"
    }
    else 
    {
        Log "**************$system was unreachable**************"
    }

}