使用C#复制目录权限

时间:2019-09-27 11:18:48

标签: c# windows directory user-permissions

我需要将安全权限从一个文件夹复制到一堆文件夹。

我需要将许可权更改为大量子文件夹。我想从具有正确安全性设置的现有文件夹中复制权限。 该代码运行没有错误,但是没有任何变化。如果我创建现有文件夹的副本,则权限确定。

DirectorySecurity permissions = Directory.GetAccessControl(srcFolder);

foreach (var subfolder in Directory.GetDirectories(containingFolder, "*", SearchOption.TopDirectoryOnly))
{             
    Directory.SetAccessControl(subfolder, permissions);  // no change
    Directory.CreateDirectory(subfolder + "_copy", permissions); // new folder has permissions as expected                          
}

我希望subfolder中的所有containingFoldersrcFolder具有相同的权限。

1 个答案:

答案 0 :(得分:0)

Sinatr提供了以下链接,该链接描述了为什么您的代码无法正常工作以及如何对其进行修复。我注意到该链接引用的是页面顶部而不是备注部分。这是包含所需信息的部分。下面列出的是正确的链接。

Directory.SetAccessControl Method Remarks

对于将来的读者,我将在此处总结文档说明的内容并提供一个小的代码示例。

首先是问题

您不能直接使用一个文件/文件夹中的DirectorySecutrity对象并将其仅通过GetAccessControl / SetAccessControl应用于另一个文件/文件夹。

来自Microsoft:

  

SetAccessControl方法仅保留DirectorySecurity对象   创建对象后已修改的对象。如果是DirectorySecurity   对象没有被修改,它不会被持久化到文件中。   因此,不可能检索DirectorySecurity对象   从一个文件中删除,然后将同一对象重新应用于另一个文件。

现在解决方案

以下是Microsoft概述的步骤,这些步骤使您可以将安全性信息从一个文件或文件夹复制到另一个文件或文件夹。请注意,注释来自文档,代码来自我的测试程序。

using System.Security.AccessControl;
using System.IO;
. . . . 

string srcFolder = @"d:\srcFolder", desFolder = @"d:\desFolder";
byte[] securityDescriptor = null;


// Step 1: Use the GetAccessControl method to retrieve the
// DirectorySecurity object from the source file.
DirectorySecurity srcPermissions = Directory.GetAccessControl(srcFolder);

// Step 2: Create a new DirectorySecurity object for the destination file.
DirectorySecurity desPermissions = new DirectorySecurity();


// Step 3: Use the GetSecurityDescriptorBinaryForm method of the
// source DirectorySecurity object to retrieve the ACL information.
securityDescriptor = srcPermissions.GetSecurityDescriptorBinaryForm();

// Step 4: Use the SetSecurityDescriptorBinaryForm method to copy the
// information retrieved in step 3 to the destination
// DirectorySecurity object.
desPermissions.SetSecurityDescriptorBinaryForm(securityDescriptor);

// Step 5: Set the destination DirectorySecurity object to the
// destination file using the SetAccessControl method.
Directory.SetAccessControl(desFolder, desPermissions);

要对此进行测试,我创建了两个文件夹。一个称为srcFolder,另一个称为desFolder。在desFolder上,我除去用户帐户以外的所有权限。请注意,必须存在至少一个允许访问的组或用户帐户。