【发布时间】: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