使用 C# 复制目录权限

Copying directory permissions with C#

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

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

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                          
}

我希望 containingFolder 中的所有 subfolder 都具有与 srcFolder 相同的权限。

Sinatr 提供了以下 link 描述了您的代码为何不起作用以及如何修复它。我注意到 link 引用了页面顶部而不是备注部分。这是包含您需要的信息的部分。下面列出的是正确的 link.

Directory.SetAccessControl Method Remarks

为了以后的读者,我将在这里总结文档的内容并提供一个小代码示例。

先问题

您不能直接使用来自一个 file/folder 的 DirectorySecutrity 对象,然后仅使用 GetAccessControl/SetAccessControl.

将其应用于另一个 file/folder

来自微软:

The SetAccessControl method persists only DirectorySecurity objects that have been modified after object creation. If a DirectorySecurity object has not been modified, it will not be persisted to a file. Therefore, it is not possible to retrieve a DirectorySecurity object from one file and reapply the same object to another file.

现在解决

以下是 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 上,我删除了除我的用户帐户之外的所有权限。请注意,至少需要一个组或用户帐户才能授予访问权限。