【问题标题】:Access Denied when copying DLL files for particular client为特定客户端复制 DLL 文件时访问被拒绝
【发布时间】:2013-05-15 04:15:21
【问题描述】:

我们有一个小型实用程序,可以通过简单地复制/替换某些文件来更新客户端计算机上的软件。这些文件由 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 手动复制文件时,文件复制/替换就好了。我检查了这些文件的属性,它们不是隐藏的,也不是只读的。

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

【问题讨论】:

  • 来自 MSDN (msdn.microsoft.com/en-us/library/windows/desktop/…) 如果目标文件已经存在并且设置了 FILE_ATTRIBUTE_HIDDEN 或 FILE_ATTRIBUTE_READONLY 属性,此函数将失败并显示 ERROR_ACCESS_DENIED。
  • 不是一个真正的问题?无关?为什么会有人这么想?如果有的话,我会期望过于本地化。而且这些文件不是隐藏的或只读的。
  • "目标通常是 C: 根目录中的一个目录,但也发生在 Program Files (x86) 和他们计算机上的其他任何地方。" - 一个软件只有一个地方,它是“程序文件”。 “C: root”和“anywhere else”不应该作为一个术语存在!
  • @iPath 是的,但是这个软件已经有 20 年的历史了,从 95 年代的 Windows 回来,不管你信不信,我们仍然有 95 年代的人
  • 啊哈,那是另一个故事;)

标签: delphi permissions delphi-xe2 access-denied file-copying


【解决方案1】:

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

更新: 如果程序太旧(即不符合 MS 对软件/数据位置的建议)MS ACT (Microsoft Application Compatibility Toolkit (ACT)) 可以成为您的朋友。

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多