首页 文章

Powershell脚本无法从Windows 7机器获取应用程序列表数据

提问于
浏览
0

最近,我制作了一个脚本,列出本地和远程机器中所有已安装的应用程序,并在excelsheet中以结构化方式提供输出 .

它看起来像这样:

$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,我可能不得不使用

“SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall”而不是

“SOFTWARE \微软\的Windows \ CurrentVersion \卸载” .

使用这个不同的路径,当我再次运行相同的脚本时,我收到一个错误:

使用“2”参数调用“OpenRemoteBaseKey”的异常:“找不到网络路径 .

在:行:24字符:62

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

可能我需要在脚本中更改其他内容吗?我运行脚本的机器是一台Windows XP SP3机器 .

3 回答

  • 0

    不幸的是,WMI Win32_Product类不报告在控制面板的“添加或删除程序”中找到的所有应用程序...

    注册表步骤似乎是不可避免的,请参阅:http://powergui.org/thread.jspa?threadID=17068 http://learningpcs.blogspot.fr/2011/10/powershell-get-installed-software.html

  • 1

    我会使用WMI而不是梳理注册表 . 见 Win32_Productfriends例如:

    Get-WmiObject Win32_Product
    

    请注意,如果我在64位PowerShell提示符下在Windows 7 x64系统上运行此命令,则会显示所有已安装的应用程序(32位和64位):

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

    要查看所有可用的属性,请执行:

    Get-WmiObject Win32_Product | Select -First 1 | Format-List *
    
  • 0

    我记得有一段时间我在一家IT公司做了类似的事情,我们只是在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
    

相关问题