PowerShell可通过注册表、WMI/CIM等多源线索推断Windows软件依赖关系,如查询Uninstall键提取VC++、.NET等运行时组件信息,并用Get-ChildItem结合Get-ItemProperty筛选分析。
powershell 可以通过查询注册表、wmi/cim、文件系统和已安装程序清单,快速识别 windows 上软件的依赖关系,但需注意:windows 本身不维护通用“软件依赖图谱”,所谓依赖检测实际是结合多种线索进行推断,例如 dll 引用、服务依赖、启动项调用、注册表硬编码路径等。
检查已安装程序及其关联组件
多数桌面软件会向注册表写入安装信息,可从中提取常见依赖项线索:
- 查询 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 和 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall(32位程序),筛选 DisplayName 包含 “Visual C++ Redistributable”、“.NET Framework”、“DirectX” 等关键词的条目
- 使用 Get-ChildItem + Get-ItemProperty 提取 DisplayVersion、InstallLocation、Publisher 字段,判断是否为运行时依赖组件
- 示例命令:Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_.DisplayName -match "C\+\+|\.NET|Runtime" } | Select DisplayName, DisplayVersion, InstallLocation
分析可执行文件的动态链接库(DLL)依赖
对目标软件主程序(如 app.exe)进行静态 DLL 引用扫描,识别其直接依赖的系统或第三方模块:
- 使用 dumpbin /dependents "C:\Path\To\App.exe" 2>$null | Select-String "\.dll"
- 更轻量方式:借助开源工具 Dependencies.exe(替代旧版 Dependency Walker),支持命令行导出 JSON,PowerShell 可解析其输出
- 注意:静态分析仅反映编译期声明的依赖,不体现运行时加载(如 LoadLibrary 调用),需结合后续行为监控
枚举服务、计划任务与启动项中的隐式依赖
许多软件通过后台服务、开机启动或定时任务运行,其配置中常包含对其他程序或路径的硬依赖:
- 服务依赖:Get-Service | ForEach-Object { $_ | Add-Member -NotePropertyName DependentServices -NotePropertyValue ($_.DependentServices.Name -join ';') -PassThru } | Where-Object { $_.DependentServices }
- 启动项:Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location, User,检查 Command 是否调用外部 EXE 或脚本
- 计划任务:Get-ScheduledTask | Where-Object { $_.State -eq 'Ready' } | Get-ScheduledTaskInfo | Select-Object TaskName, LastRunTime, LastTaskResult,再用 Get-ScheduledTask -TaskName "xxx" | Select-Object -ExpandProperty Actions 查看具体执行命令
验证关键运行时是否存在且可用
检测到潜在依赖后,需确认其实际可被调用,避免“注册表有、磁盘无”的假阳性:
- 检查目录与文件:Test-Path "C:\Program Files\Microsoft Visual C++ Redistributable\msvcp140.dll"
- 验证 .NET 版本:[System.Environment]::Version(当前 PowerShell 运行时)或读取 HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release 值比对版本映射表
- 测试 DLL 加载(谨慎使用):try { [System.Reflection.Assembly]::LoadFile("C:\path\to\dep.dll") } catch { Write-Warning "Failed to load dependency" }


















