Недавно я создал сценарий для отображения списка всех установленных приложений на локальном и удаленном компьютере и структурированного вывода результатов в виде таблицы исключений.
Это выглядит так:
$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.