1

我们有一个小型实用程序,它通过简单地复制/替换某些文件来更新客户端计算机上的软件。这些文件由 EXE 和 DLL 组成。一切正常,除了我们的一位客户。他们有一个 Active Directory 域(就像我们的许多客户一样),但在每台计算机上,DLL 文件都无法复制,错误代码为 5(拒绝访问)。即使应用程序以管理员身份运行 - 以管理员身份登录计算机。发生在他们所有的 XP、Vista 和 7 机器上。EXE 文件被很好地复制/替换,但不是 DLL 文件。如果 DLL 不存在,它会很好地复制。但如果它需要更换,它就会失败。

这些文件是使用 API 调用复制的:

function CopyFile(lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL): BOOL; stdcall;

源是一个由自解压包自动创建的临时文件夹,目标是我们软件的安装位置(由我们的注册表项标识)。目标通常是 C: 根目录中的一个目录,但也发生在 Program Files (x86) 和他们计算机上的其他任何地方。他们的 IT 人员坚持认为他们没有在他们的域中配置特殊设置来阻止这种情况。这是我们唯一遇到此问题的客户,并且发生在他们所有 20 多台计算机上。但是,当我通过 Windows 手动复制文件时,文件复制/替换就好了。我检查了这些文件的属性,它们不是隐藏的或只读的。

我还需要做什么来确保正确访问?由于以管理员身份运行不成功吗?

4

1 回答 1

2

使用 procMon 跟踪您的更新实用程序。您应该会看到 ACCESS_DENIED 错误。分析它们。密切关注模仿。还要询问他们是否有任何软件 IPS、“愤怒的”防病毒软件,或者他们是否配置了 Software Restirction/AppLocker。最后一个可能与您的问题没有真正的联系,但请尝试一下。不太可能成为问题,但如果您的实用程序是 32 位并且没有清单,它可能会被操作系统(Vista 和更高版本)静默重定向。

更新:如果程序太旧(即不符合 MS 对软件/数据位置的建议),MS ACT(Microsoft 应用程序兼容性工具包 (ACT))可以成为您的朋友。

于 2013-05-20T16:57:05.190 回答