Сценарий установки установленной программы Powershell не возвращает имя компьютера

Я пытаюсь получить список установленных программ с группы удаленных серверов. Я могу получить имя программы, но не возвращаю имя системы. Ниже мой скрипт.

$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
  }

Ниже мой вывод

введите здесь описание изображения


person Slyons    schedule 27.09.2017    source источник
comment
Вы написали это сами на основе документации PowerShell или скопировали откуда-то еще? Потому что первым шагом будет проверка документов API, чтобы убедиться, что вы делаете что-то, что можно сделать, а они говорят вам, что не существует такой вещи, как Systemname, это класс Win32_Product: msdn.microsoft.com/en-us/library/aa394378(v=vs.85). aspx   -  person Mike 'Pomax' Kamermans    schedule 27.09.2017


Ответы (2)


Во-первых, -ComputerName может принимать массив имен, поэтому, зацикливая, вы увеличите время, потому что цикл будет последовательным, а использование массива для имени компьютера будет параллельным.

Во-вторых, рекомендуется использовать командлеты CIM вместо командлетов WMI. По умолчанию они работают через WSMAN, и с ними проще работать.

В-третьих, Win32_Product принудительно выполняет проверку согласованности, поэтому чтение Удалить ключи реестра обычно лучше.

Наконец, 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
person BenH    schedule 27.09.2017

Другой подход заключается в использовании столбца Invoke-Command, где он автоматически дополняет результат столбцом 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
person Alex Sarafian    schedule 28.09.2017