我需要将一个目录中的所有文件替换为另一个目录中的备份文件。必须保留所有文件属性/权限/所有权。 File.Copy,就像Windows资源管理器一样,复制文件,清除所有权限,并将所有者更改为自己。
我在SO上找到了一个示例,它应该保留其原始权限但不保留:Copy a file with its original permissions
代码:
File.Copy(originFile, destinationFile);
FileInfo originFileInfo = new FileInfo(originFile);
FileInfo destinationFileInfo = new FileInfo(destinationFile);
FileSecurity ac1 = originFileInfo.GetAccessControl(AccessControlSections.All);
ac1.SetAccessRuleProtection(true, true);
destinationFileInfo.SetAccessControl(ac1);
我收到了PrivilegeNotHeldException:
The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation.
如果我禁用UAC,我会收到此错误:
The security identifier is not allowed to be the owner of this object.
我使用AccessControlSections.All和AccessControlSections.Owner获得此异常。如果我将enum更改为AccessControlSections.Access,但代码仍然有效,但只保留权限,而不是所有权。我是本地管理员,即使目的地是我的本地PC,它也不起作用。我以管理员身份运行Visual Studio 2010。
答案 0 :(得分:0)
您可能需要明确获取' SeSecurityPrivilege'。也许最简单的方法是使用Process Privileges。
// Untested code, but it might look like this...
// (Add exception handling as necessary)
Process process = Process.GetCurrentProcess();
using (new PrivilegeEnabler(process, Privilege.Security))
{
// Privilege is enabled within the using block.
File.Copy(originFile, destinationFile);
FileInfo originFileInfo = new FileInfo(originFile);
FileInfo destinationFileInfo = new FileInfo(destinationFile);
FileSecurity ac1 = originFileInfo.GetAccessControl(AccessControlSections.All);
ac1.SetAccessRuleProtection(true, true);
destinationFileInfo.SetAccessControl(ac1);
}
答案 1 :(得分:0)
我没有权限在我本地计算机上没有的任何文件上调用GetAccessControl(第一个错误),我无法设置我拥有的任何文件的所有者(第二个错误),我只能授予“取得所有权”权利。作为域管理员运行该工具解决了所有问题。