最近,我制作了一个脚本,列出本地和远程机器中所有已安装的应用程序,并在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 回答
不幸的是,WMI Win32_Product类不报告在控制面板的“添加或删除程序”中找到的所有应用程序...
注册表步骤似乎是不可避免的,请参阅:http://powergui.org/thread.jspa?threadID=17068 http://learningpcs.blogspot.fr/2011/10/powershell-get-installed-software.html
我会使用WMI而不是梳理注册表 . 见
Win32_Product
和friends例如:请注意,如果我在64位PowerShell提示符下在Windows 7 x64系统上运行此命令,则会显示所有已安装的应用程序(32位和64位):
要查看所有可用的属性,请执行:
我记得有一段时间我在一家IT公司做了类似的事情,我们只是在C:目录中查找以.exe结尾的所有程序的名称,以便优化我们会磨练我们正在寻找的特定应用程序 . 我们根据我们想要的情况设置了一个会通过或失败的批次 . 请记住,这是一个批处理文件,但这个想法是类似的 .