我们的销售人员安装了一个内部应用程序,该应用程序使用存储在 System32 中的一些自定义 COM 对象/DLL。我一直试图用较新版本的 DLL 替换其中一个,安装后可以正常工作,但重新启动后就不行了。
有趣的部分就在这里。
- 我使用 regsvr32 /u myDll.dll 取消注册旧的 DLL
- Regsvr32 显示一个对话框,表示成功。
- 我将旧的 DLL 复制到“保存”文件夹中,并将其重命名为 20110412-myDll.dll_。
- 我从system32中删除了原来的内容。
- 我将新的 DLL 放在了 system32 中。
- 使用 regsvr32 myDll.dll 注册新的 dll
- 使用 VBScript 测试新的 DLL - 运行良好。
- 有趣的是
- 重启。
- 重新运行测试 vb 脚本。它失败。
- 查看 system32 中的 DLL(我替换的)。它已神奇地被旧 DLL 替换。我
fc
使用 system32\myDll.dll 和保存的 20110412-myDll.dll_(二进制比较)验证了这一点。 - 删除旧的 DLL。确认它确实消失了。
- 在所有驱动器中搜索“myDll.DLL”,包括系统文件夹。验证“save”文件夹中除了重命名的版本外,没有旧 DLL 的实例。
- 重启
- 旧的 DLL 又神奇地出现了。
我为此使用的用户帐户对机器具有完全管理权限。我找不到任何可以执行此操作的正在运行的进程,我们的 IT 部门束手无策。
有人有什么建议吗?
更新
只是为了好玩,我以安全模式启动了其中一台机器,安装了新的 DLL,然后再次重新启动。这次更改似乎起作用了,即使在随后的重新启动之后也是如此。很奇怪。
我可以在出现同样问题的其他机器上执行此操作,并且我希望它能正常工作,但我真的很想知道问题是什么。啊。
答案1
这很可能是系统还原的问题。请尝试在替换 DLL 之前禁用它。
有关详细信息,请参阅For more info, seeWindows 操作系统中的系统还原是什么?
答案2
C:\Windows\System32\DLLCache
系统正在用以下文件替换 DLLWindows 文件保护. 在事件查看器(在管理工具中)中检查系统日志是否存在此事件:
事件 ID:64001 来源:Windows 文件保护 描述:尝试对受保护的系统文件 C:\Windows\System32\myDll.DLL 进行文件替换。此文件已恢复为原始版本以保持系统稳定性。系统文件的文件版本为 xx:xx
尝试删除存储在中的 DLL 文件DLLCache
,再次替换 中的 DLL System32
,然后重新启动计算机
编辑:检查安全软件中的日志,因为某些安全程序会监视系统 DLL 并阻止替换文件的尝试。您也可以尝试使用进程监控检查哪个程序正在替换 DLL,尤其是在启动时使用位于“选项”下的“启用启动日志记录”功能。