Надеюсь, это кому-нибудь поможет: я использую перечисление на основе реестра в своих сценариях (как предложено в некоторых ответах выше), но обнаружил, что оно неправильно перечисляет 64-разрядное программное обеспечение при работе в Windows 10 x64 через SCCM (который использует 32-битный клиент). Нашел что-то вроде этого, чтобы быть самым простым решением в моем конкретном случае:
Function Get-Programs($Bits) {
$Result = @()
$Output = (reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /reg:$Bits /s)
Foreach ($Line in $Output) {
If ($Line -match '^\s+DisplayName\s+REG_SZ\s+(.+?)$') {
$Result += New-Object PSObject -Property @{
DisplayName = $matches[1];
Bits = "$($Bits)-bit";
}
}
}
$Result
}
$Software = Get-Programs 32
$Software += Get-Programs 64
Понимают, что это немного слишком плохо для Perl, но все другие альтернативы, которые я видел, включали безумие со скриптами-обертками и подобными умными и умными решениями, и это кажется немного более человечным.
P.S. Изо всех сил стараюсь воздержаться от выкладывания тонны соли на Microsoft здесь, чтобы сделать абсолютно тривиальную вещь почти невозможной. То есть, перечисление всех версий MS Office, используемых в сети, является задачей, которая заставит плакать взрослого человека.