0

我需要用另一个目录中的备份文件替换一个目录中的所有文件。必须保留所有文件属性/权限/所有权。File.Copy 就像 Windows 资源管理器一样,复制文件,清除所有权限,并将所有者更改为我自己。

我在 SO 上找到了一个示例,它应该保留其原始权限但不:复制具有原始权限的文件

编码:

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 得到这个异常。如果我将枚举更改为 AccessControlSections.Access,则代码有效,但仅保留权限,而不保留所有权。我是本地管理员,即使目的地是我的本地 PC,它也不起作用。我正在以管理员身份运行 Visual Studio 2010。

4

2 回答 2

0

我无权对不在本地计算机上的任何文件调用 GetAccessControl(第一个错误),并且我无法设置我拥有的任何文件的所有者(第二个错误),我只能授予“获取所有权” “权利。以域管理员身份运行该工具解决了所有问题。

于 2013-10-02T18:58:12.743 回答
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);
}
于 2013-10-01T21:33:04.970 回答