![查找依赖项](https://linux22.com/image/1420401/%E6%9F%A5%E6%89%BE%E4%BE%9D%E8%B5%96%E9%A1%B9.png)
一个程序在我的硬盘上安装了 c:/windows/syswow64/msxml4.dll。遗憾的是,这是一个存在安全问题的旧版本 (4.30.2100.0),因此我真的想删除该文件以及安装它的程序。
MSXML4 不在“程序和功能”下我可以卸载的程序列表中。有没有办法找到在 Windows 8.1 中安装它的程序?
希望你们能提供帮助。
答案1
查找依赖项
正如@DavidMarshall所建议的,你可以使用依赖性遍历器:
Dependency Walker 是一款免费实用程序,可扫描任何 32 位或 64 位 Windows 模块(exe、dll、ocx、sys 等),并构建所有依赖模块的层次树形图。对于找到的每个模块,它会列出该模块导出的所有函数,以及其中哪些函数实际上被其他模块调用。
但是,如果你有很多程序,那么逐个检查它们就不现实了。另一种方法是打开一个提升的命令提示符,并运行以下命令:
type nul>"%temp%\find.txt" & for /r "%systemdrive%\" %G in (*.exe;*.dll) do @find /i "msxml4.dll" "%~fG" >nul 2>&1 && echo %~fG>>"%temp%\find.txt"
msxml4.dll
该命令的作用是以不区分大小写的方式递归扫描系统驱动器中每个应用程序和库文件的内容来查找字符串。
结果存储在find.txt
用户临时文件夹中的文件中。它并不完美(见下文),但它可能会给你一些提示。
评论
该
find
命令专为文本文件而设计。虽然它也适用于二进制文件,但某些实例可能会被忽略,具体取决于它们的存储方式。文件权限也可能阻止扫描某些文件。如果您有未安装在系统驱动器中的程序,您可以重新运行上述命令并指定相应的驱动器号。
您可以包含其他扩展,例如:
.cpl = Control panel item .ocx = ActiveX control .scr = Screen saver .sys = System file (e.g. device drivers)
进一步阅读
答案2
这是我使用 powershell 扫描时想到的方法。我是 powershell 新手,所以它可能不太好用,但确实有效。
$hostName = hostname
$appFilePath = "C:\Windows\Temp\DLL_$hostName.csv"
$scanPath = 'C:\'
$exefile = "*.exe"
$dllFile = "*.dll"
下面创建 c$ 上所有 DLL 和 EXE 的列表:
$dll = dir -ErrorAction SilentlyContinue -Recurse -Path $scanPath -Include @($exefile, $dllFile)
下面查看每个文件是否引用了 MSXML4.dll。在我的 149gb 数据上大约需要 30 分钟:
$dll | Select-String "msxml4.dll" -ErrorAction SilentlyContinue | group $($_.name) | select name | export-csv -path $appFilePath`
输出未格式化,因此您将获得类似以下内容:
C:\Windows\SysWOW64\migwiz\unbcl.dll:45:Cclass UnBCL::TimeSpan __thiscall UnBCL::TimeSpan::Add(const class UnBCL::TimeSpan &) constresult of TimeSpan additio..... and so on
我扫描过的每台机器上都有 unbcl.dll,可以忽略它。我认为它只是在寻找 MSXML4.dll,即使它不在机器上。
您还将获得如下精彩内容:
"C:\Users\USERX\Documents\Toad for Oracle 10.1 - R2 Commercial.exe:5045:File_Name=""msxml4.dll"" "
答案3
更好的扫描是添加 windows\system32 和/或 windows\syswow64
例如:
类型
nul>"%temp%\find.txt" & for /r "%systemdrive%\windows\syswow64" %G in (*.exe;*.dll) do @find /i "msxml4.dll" "%~fG" >nul 2>&1 && echo %~fG>>"%temp%\find.txt"