2013-05-20 35 views
1

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

这些文件是通过API调用复制:

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

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

我还需要做些什么来确保正确访问?由于以管理员身份运行并不能解决问题吗?

+0

This from MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851%28v=vs.85%29.aspx)如果目标文件已经存在,则此函数会因ERROR_ACCESS_DENIED而失败并设置了FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_READONLY属性。 –

+0

不是一个真正的问题?无关?为什么有人会这样想?如果有什么我会期望过于本地化。这些文件不是隐藏的或只读的。 –

+0

“目标通常是C:根目录中的一个目录,但也会发生在Program Files(x86)和其他计算机上的任何其他位置。” - 只有一个软件的地方,它是“程序文件”。 “C:根”和“其他地方”不应该作为一个术语存在! –

回答

2

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

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