需启用psremoting并用get-itemproperty读取双注册表路径,通过invoke-command批量拉取各终端uninstall项,过滤kb/update条目后导出csv。
在 windows 环境中,用 powershell 批量获取多台终端的已安装软件列表,核心是结合 get-wmiobject 或更现代的 get-ciminstance(推荐),配合远程执行机制(如 winrm 或 psremoting),并统一收集、导出结果。
确认目标机器已启用 PowerShell 远程(PSRemoting)
这是批量执行的前提。若未启用,Invoke-Command 将无法连接:
- 在每台目标电脑上以管理员身份运行:
Enable-PSRemoting -Force - 确保防火墙允许 WinRM 流量(默认 TCP 5985);域环境下通常已配置,工作组需额外设置信任主机或证书
- 验证连通性:在控制机运行
Test-WsMan -ComputerName PC01或Enter-PSSession -ComputerName PC01
使用 Get-CimInstance 获取准确、兼容性强的软件列表
Win32_Product 类虽直观,但调用会触发 MSI 自检,慢且可能引发副作用;推荐改用 Win32_InstalledWin32Program(Windows 10/11 1809+)或注册表方式。更稳妥通用的做法是读取「Uninstall」注册表项:
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 64位系统需同时查两个路径:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall和HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall - 脚本中可用
Get-ItemProperty配合Get-ChildItem递归读取,过滤掉 DisplayName 为空或含“Update”、“KB”等非用户软件条目 - 示例关键片段:
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" -ErrorAction SilentlyContinue |
Get-ItemProperty -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -and $_.DisplayName -notmatch '^(KB|Update|Hotfix)' } |
Select-Object @{n='Computer';e={$env:COMPUTERNAME}}, DisplayName, DisplayVersion, Publisher, InstallDate
批量执行并汇总到本地 CSV 文件
用 Invoke-Command 并行拉取各终端数据,再合并导出:
- 准备目标主机列表(如
$Computers = 'PC01','PC02','SRV01'或从文本文件读取:Get-Content .computers.txt) - 执行命令时加
-AsJob可提升效率(尤其机器较多时),之后用Receive-Job收集结果 - 完整脚本结构示意:
$Results = Invoke-Command -ComputerName $Computers -ScriptBlock {
# 上面注册表查询代码(注意:$env:COMPUTERNAME 在远程会自动为对应主机名)
} -ErrorAction SilentlyContinue
$Results | Export-Csv .SoftwareInventory.csv -NoTypeInformation -Encoding UTF8
注意事项与简化替代方案
若部分终端无法启用 PSRemoting(如受限环境),可改用“推送脚本+回传”模式:
- 将采集脚本保存为
Get-InstalledSoftware.ps1,用Copy-Item推送到目标机的临时目录 - 通过
Invoke-WmiMethod或计划任务触发执行,并输出到共享文件夹或本地日志,再集中读取 - 对于仅需基础信息的场景,也可直接用
wmic /node:@list.txt product get name,version,vendor /format:csv > out.csv(但 wmic 已弃用,不推荐新项目)










