如何识别服务器与工作站中依赖各版本.NET Framework的已安装应用
如何识别服务器与工作站中依赖各版本.NET Framework的已安装应用
针对你提到的漏洞扫描发现EoL(终止支持).NET版本、需要安全清理又怕破坏业务的场景,我整理了几个在服务器和工作站上定位.NET依赖应用的实用方法,都是我平时运维里亲测有效的:
PowerShell批量扫描脚本
不用装额外工具,直接用Windows自带的PowerShell就能批量扫描已安装程序的.NET依赖。以管理员权限打开PowerShell,运行这段脚本:Get-ChildItem -Path "C:\Program Files", "C:\Program Files (x86)" -Recurse -Include *.exe, *.dll -ErrorAction SilentlyContinue | ForEach-Object { try { $assembly = [Reflection.AssemblyName]::GetAssemblyName($_.FullName) if ($assembly -and $assembly.FullName -match "Version=(\d+\.\d+\.\d+\.\d+)") { $appInfo = Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue | Where-Object { $_.InstallLocation -and $_.InstallLocation -like "$($_.DirectoryName)*" } [PSCustomObject]@{ FilePath = $_.FullName DotNetVersion = $matches[1] ApplicationName = if ($appInfo) { $appInfo.DisplayName } else { "未关联已安装程序" } } } } catch { # 跳过非.NET程序或无权限访问的文件 } } | Where-Object { $_.DotNetVersion } | Sort-Object DotNetVersion, ApplicationName | Out-GridView脚本会遍历Program Files下的可执行文件,提取依赖的.NET版本,还会关联已安装程序的名称,最后用网格视图展示,方便筛选。如果是服务器,记得也要扫描自定义的应用安装目录。
Windows事件日志回溯
要是有些应用之前因为.NET版本缺失报错过,Windows应用日志里会留下痕迹。可以用PowerShell过滤事件ID 1026(.NET运行时未处理异常),快速定位有依赖问题的应用:Get-WinEvent -LogName Application -FilterXPath "*[System[EventID=1026]]" -ErrorAction SilentlyContinue | Select-Object TimeCreated, ProcessId, @{Name="Application"; Expression={$_.Properties[0].Value}}, @{Name="MissingDotNetVersion"; Expression={$_.Message -split "`n" | Where-Object { $_ -match "Version=(\d+\.\d+\.\d+\.\d+)" } | ForEach-Object { $matches[1] }}}这个方法适合排查已经出现故障的应用,但需要应用曾经启动过才会有日志记录。
手动检查配置文件与IIS设置
对于桌面.NET应用,直接找程序目录下的app.config文件,里面的<supportedRuntime>节点会明确列出依赖的.NET版本;服务器上的IIS Web应用更简单:- 打开IIS管理器,找到对应应用的应用池,查看“高级设置”里的“.NET CLR版本”,就能知道托管应用依赖的版本;
- 也可以查看网站根目录下的
web.config,同样在<startup>节点里找<supportedRuntime>配置。
Process Monitor实时监控
对于不确定的应用,用微软的Process Monitor工具(Sysinternals套件里的,系统管理员一般都有):- 启动Process Monitor,设置过滤条件:“Operation”等于“Load Image”,并且“Path”包含“Microsoft.NET”;
- 运行目标应用,就能看到该进程加载的.NET核心DLL(比如mscorlib.dll、clr.dll),这些文件的路径里会带版本号(比如
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll),对应版本就是应用依赖的.NET版本。
最后提两个注意点:
- 服务器上的Windows服务如果是.NET编写的,直接看服务属性里的“可执行文件路径”,用PowerShell脚本检查该文件的依赖即可;
- 清理EoL版本前,一定要先在测试环境验证,或者给目标机器做系统还原点,避免意外导致业务中断。
备注:内容来源于stack exchange,提问作者DdJSR
相关产品推荐
相关产品推荐

