Могу ли я сравнить несколько компьютеров с помощью PowerShell? В частности, выяснить, какие из них имеют конкретную программу, а какие нет - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно сравнить несколько компьютеров, чтобы выяснить, какие из них имеют определенную программу, а какие не используют PowerShell.

Я очень новичок в этом (около недели опыта PowerShell), поэтому любая помощь поможетбыть оцененным.

1 Ответ

0 голосов
/ 18 октября 2019

Да, вы можете удаленно проверить, установлено ли программное обеспечение или нет:

# We need to check for both 64-bit and 32-bit software
$regPaths = "HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall",
  "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

# Get the name of all installed software registered in the registry with Office in the name
# (you can search for exact strings if you know them for specific versions)
$regPaths | Foreach-Object {
  ( Get-ItemProperty "${_}\*" DisplayName -EA SilentlyContinue ).DisplayName | Where-Object {
    $_ -match 'ADD_REMOVE_PROGRAMS_NAME'
  }
}

Как это работает, он проверяет 32- и 64-битные реестры на наличие установленного программного обеспечения. Под строкой $_ -match 'ADD_REMOVE_PROGRAMS_NAME' следует заменить ADD_REMOVE_PROGRAMS_NAME на любое имя программного обеспечения в «Установка и удаление программ». Обратите внимание, что этот метод не работает с некоторыми программами, которые устанавливаются с помощью установщиков на основе EXE.

Вы также можете запускать это удаленно на нескольких компьютерах, используя Invoke-Command:

$computers = Get-Content "C:\Path\To\File\With\Computer_Names.txt"
$results = Invoke-Command -ComputerName $computers {
    # We need to check for both 64-bit and 32-bit software
    $regPaths = "HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall",
      "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

    # Get the name of all installed software registered in the registry with Office in the name
    # (you can search for exact strings if you know them for specific versions)
    $regPaths | Foreach-Object {
      ( Get-ItemProperty "${_}\*" DisplayName -EA SilentlyContinue ).DisplayName | Where-Object {
        $_ -match 'ADD_REMOVE_PROGRAMS_NAME'
      }
    }
}

Invoke-Command может запускать встроенный ScriptBlock на многих компьютерах одновременно. Когда все компьютеры в списке выполнили команду, вы можете проверить результат для каждого компьютера (он возвращается как массив, чтобы вы могли проверить свойство PSCOMPUTERNAME на каждом $result, чтобы увидеть, на каких компьютерах нет программного обеспечения. Как работает приведенный выше код, он должен возвращать объект на компьютерах, на которых он есть, и ничего на компьютерах, на которых его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...