如何返回所有依赖于的应用程序.NET Framework,特定于版本



我正在努力查找所有依赖过时的应用程序。NET Framework版本。例如,在客户端环境中,他们有。NET Framework 1.0版本在其注册表中启用。这是从2002年开始的,在安全方面,它非常脆弱,有多个9.3的CVE。与相同。NET Framework 2.0,可能是3.0。

NET是通过CISA最易受攻击的应用程序之一,并且这个问题总是在多个客户端中出现。我想删除这些过时的Framework版本,但我读到使用这些旧版本构建的应用程序可能无法切换到新版本,因此它可能会破坏非常重要的应用程序,这些应用程序需要100%的正常运行时间来挽救生命。

我已经尝试了tasklist/m";mscore*";作为cmd命令,返回当前通过.dll引擎执行的应用程序。因此,它只返回正在运行的应用程序,并且不会告诉我哪些版本的。NET Framework用于正在运行的应用程序。在3.0或3.5目录中也没有mscorlib.dll版本。

我也可以用ProcMon简单地做到这一点,但我面临着同样的问题:这只会告诉我活动和运行的进程

我尝试过使用ICorPublish接口使用C#脚本,但这也只是返回PID,所以它也依赖于运行的应用程序。

ICorPublishProcess process;
process = publish.GetProcess(PidToCheck);
if (process == null || !process.IsManaged)
{
return "Process managed by .NET"
}
else
{
return "Process not managed by .NET."
}

我可以找到的所有已安装版本。NET Framework,通过:https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

然而,我找不到任何关于如何找到所有依赖于特定应用程序的应用程序的信息——无论是否运行进程。NET Framework版本。

有没有一种方法可以找到目前没有运行的、依赖旧应用程序的应用程序。NET Framework版本是否正常工作?

您可以尝试以下暴力方法,但这种方法会运行很长时间:

  • 打开提升的PowerShell实例(以管理员身份运行(,以便访问尽可能多的目录。

  • 从所有感兴趣的驱动器的根目录开始,在整个磁盘上搜索所有*.exe文件(根据您的需要,您可能还需要检查*.dll文件(,并确定它们的目标。NET CLR版本使用[System.Reflection.Assembly]::LoadFile($filePath).ImageRuntimeVersion

下面的代码演示了这一点:

# You can pass multiple root directories, if needed.
# If you need to include DLLs too, replace -Filter *.exe
# with -Include *.exe, *.dll
Get-ChildItem C: -Filter *.exe -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs | 
ForEach-Object { 
try {
[pscustomobject] @{ 
Path = $_.FullName
CLRVersion = [System.Reflection.Assembly]::LoadFile($_.FullName).ImageRuntimeVersion 
}
} 
catch {} 
} | 
Format-List

注:

  • Format-List命令仅用于显示格式化

    • 例如,如果您想以CSV格式保存结果,请改用管道传输到Export-Csv

    • 如果要将结果保存到变量($results = ...(,只需省略| Format-List即可。

  • 如果要将输出限制为特定版本,请在| Format-List:之前插入以下内容

    • 查找低于阈值的,例如所有低于4.0 的CLR版本

      | Where-Object { [version] $_.CLRVersion.Substring(1) -lt [version] '4.0' }
      
    • 要查找特定版本的,如v1.1:

      | Where-Object { $_.CLRVersion -like 'v1.1.*' }
      
  • 变量$errs将包含在文件枚举过程中发生的任何错误。

注意事项:

  • Assembly.ImageRuntimeVersion仅在中受支持。NET Frameworkv1.1及更高版本-如果您真的还有适用于1.0的应用程序,您将需要一种不同的方法(也许这个问题的答案提供了指针(。

  • 报告的版本号(例如v4.0.30319(是CLR(运行时引擎(的版本号,而不是框架的版本号。

  • 为跨平台创建的程序集。NET核心/。NET 5+版本,显然是为了向后兼容,看起来就像它们的目标一样。NET Framework 4.0版CLR(v4.0.30319(

    • 在这些。NET版本中,CLR和框架之间不再有区别,因此您可以推测地检查TargetFramework属性,如下所示;所述答案是为之写的。NET Framework,用于为编写的程序集。NET Framework 4.0及以上版本;为了使其适用于跨平台版本,必须将方法ReflectionOnlyLoadFrom替换为方法LoadFile

最新更新