1

我正在尝试从一组远程服务器中获取已安装程序的列表。我能够获取程序名称但不能返回系统名称。下面是我的脚本。

$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
ForEach ($computer in $computerfile) {
Get-WmiObject Win32_Product -ComputerName $computer |
  Select-Object SystemName,Name,Version,PackageName,Installdate,Vendor |
  Format-Table -AutoSize
  }

下面是我的输出

在此处输入图像描述

4

2 回答 2

0

首先,-ComputerName可以采用名称数组,因此通过循环您将增加时间,因为循环将是串行的,而使用数组作为计算机名将是并行的。

其次,使用 CIM cmdlet 代替 WMI cmdlet 是最佳实践。默认情况下,它们通过 WSMAN 运行,并且更易于使用。

第三,Win32_Product 强制进行一致性检查,因此读取Uninstall 注册表项通常更好。

最后,SystemName不是由Get-WMIObject. PSComputerName是您要查找的属性,您可以从中创建计算属性

$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
Get-CimInstance Win32_Product -ComputerName $Computerfile |
    Select-Object @{n=SystemName;e={$_.PSComputerName}},Name,Version,PackageName,Installdate,Vendor |
    Format-Table -AutoSize
于 2017-09-27T17:31:52.517 回答
0

另一种方法是使用Invoke-Commandwhere 它会自动将结果与PSComputerName列一起扩展

首先构建脚本块以用作查询

块 1 是我对 x32 和 x64 实现的方法。考虑将此作为替代方案,因为我对提议的实施有一些问题。

$block1={
    # Query x64 bit applications
    $queryPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
    Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion

    # Query x32 bit applications
    $queryPath="HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
    Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion
}

第 2 块是关于这个问题的建议方法

$block2={
    Get-CimInstance Win32_Product | Select-Object Name,Version,PackageName,Installdate,Vendor
}

或者在服务器列表$block1$block2远程执行

Invoke-Command -ComputerName $computernames -ScriptBlock $block1

一个记录看起来像这样

DisplayName    : Microsoft Visual C++ 2013 x86 Additional Runtime - 12.0.21005
Publisher      : Microsoft Corporation
InstallDate    : 20161202
DisplayVersion : 12.0.21005
PSComputerName : MECDEVAPP01
RunspaceId     : 4b8cc747-da25-4c6e-b108-0ca3138c0335
于 2017-09-28T08:29:13.560 回答