Сценарий Powershell не может получить данные списка приложений с компьютера с Windows 7 - PullRequest
0 голосов
/ 08 апреля 2010

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

Это выглядит так:

$a = Read-Host "Enter machine name" | Out-File -filepath C:\machine.txt
$computerName = Get-Content C:\machine.txt 
$a = New-Object -comobject Excel.Application
$a.visible = $True

$b = $a.Workbooks.Add()
$c = $b.Worksheets.Item(1)

$c.Cells.Item(1,1) = "Name"
$c.Cells.Item(1,2) = "Publisher"
$c.Cells.Item(1,3) = "InstalledDate"
$c.Cells.Item(1,4) = "Version"
$c.Cells.Item(1,5) = "UninstallString"

$d = $c.UsedRange
$d.Interior.ColorIndex = 19
$d.Font.ColorIndex = 11
$d.Font.Bold = $True

$i = 2
function Get-InstalledAppReg ([string]$ComputerName) {

  $RegPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  $BaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $ComputerName)
  $OpenSubKey = $BaseKey.OpenSubKey($RegPath)
$i =2
  $OpenSubKey.GetSubKeyNames() | ForEach {
    $Path = "$RegPath\$_"
    $BaseKey.OpenSubKey($Path).GetValue("DisplayName")
      $BaseKey.OpenSubKey($Path).GetValue("Publisher")
      $BaseKey.OpenSubKey($Path).GetValue("InstalledDate")
      $BaseKey.OpenSubKey($Path).GetValue("Version")
      $BaseKey.OpenSubKey($Path).GetValue("UninstallString")
$c.Cells.Item($i,1) = $BaseKey.OpenSubKey($Path).GetValue("DisplayName")
$c.Cells.Item($i,2) = $BaseKey.OpenSubKey($Path).GetValue("Publisher")
$c.Cells.Item($i,3) = $BaseKey.OpenSubKey($Path).GetValue("InstalledDate")
$c.Cells.Item($i,4) = $BaseKey.OpenSubKey($Path).GetValue("Version")
$c.Cells.Item($i,5) = $BaseKey.OpenSubKey($Path).GetValue("UninstallString")
$i ++
  }
}
Get-InstalledAppReg($computerName)

$d.EntireColumn.AutoFit()
$b.SaveAs("c:\softhive.xlsx")
$b.Close()
$a.Quit()
Get-Process | Where { $_.Name -Eq "Excel" } | Kill

Этот скрипт отлично работает для всех удаленных машин, на которых установлена ​​ОС XP.

Проблема началась, когда я запустил ее в Windows и на машинах удаленно.

Первоначально это дало ошибку неверного пути, когда я понял, что для Windows 7, я, вероятно, должен использовать

«ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall» вместо

"SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall".

С этим другим путем, когда я снова запускаю тот же скрипт, я получаю ошибку:

Исключение, вызывающее "OpenRemoteBaseKey" с аргументом (ами) "2": "Сетевой путь не найден.

"

В: строка: 24 символа: 62

  • $ BaseKey = [Microsoft.Win32.RegistryKey] :: OpenRemoteBaseKey (<<<< "LocalMachine", $ ComputerName) </li>

Возможно, мне нужно изменить другие вещи в скрипте? Мой компьютер, с которого я запускаю скрипт, - это компьютер с Windows XP SP3.

Ответы [ 3 ]

1 голос
/ 06 декабря 2012

К сожалению, класс WMI Win32_Product не сообщает обо всех приложениях, найденных в панели управления «Установка и удаление программ» ...

Обход реестра кажется неизбежным, см .: http://powergui.org/thread.jspa?threadID=17068 http://learningpcs.blogspot.fr/2011/10/powershell-get-installed-software.html

0 голосов
/ 09 июня 2015

Я помню, что некоторое время назад я делал что-то подобное в ИТ-фирме, и мы просто искали в каталоге C: имена всех программ, заканчивающихся на .exe, чтобы оптимизировать их, чтобы отточить конкретные приложения, которыми мы занимались. находясь в поиске. Мы создали пакет, который будет проходить или не проходить в зависимости от того, что мы хотели. Имейте в виду, что это командный файл, однако идея похожа.

echo ================= >>Software_Scan.txt
echo Below is a list of all wireless networks. Saved networks will be found in the Wireless Profiles folder 
set filePath=
for /R "C:\Program Files (x86)" /D %%a in (*) do if exist "%%a\YahooMessenger.exe" set filePath=%%a& goto continue
:continue
if defined filePath echo %COMPUTERNAME% FAIL Yahoo Messenger >> Software_Scan.txt
if NOT defined filePath echo %COMPUTERNAME% PASS Yahoo Messenger >> Software_Scan.txt
0 голосов
/ 08 апреля 2010

Вместо того, чтобы прочесывать реестр, я бы использовал WMI для этого. См. Win32_Product и друзей например ::

Get-WmiObject Win32_Product

Обратите внимание, что, если я запустил это в своей системе Windows 7 x64 в 64-битной командной строке PowerShell, он отобразит все установленные приложения (32-битные и 64-битные):

Get-WmiObject Win32_Product| sort Vendor | Format-Table Name,InstallDate,Vendor

Чтобы увидеть все доступные свойства, выполните:

Get-WmiObject Win32_Product | Select -First 1 | Format-List *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...