使用C#复制目录权限

问题描述 投票:1回答:1

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

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

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具有相同的权限。

c# windows directory user-permissions
1个回答
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上,我除去用户帐户以外的所有权限。请注意,至少必须存在一个组或用户帐户才能授予访问权限。

© www.soinside.com 2019 - 2024. All rights reserved.