繁体   English   中英

使用 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                          
}

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

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

Directory.SetAccessControl 方法备注

对于未来的读者,我将在这里总结文档中的内容并提供一个小代码示例。

首先是问题

您不能直接使用一个文件/文件夹中的 DirectorySecutrity object 并仅使用 GetAccessControl/SetAccessControl 将其应用到另一个文件/文件夹。

来自微软:

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

现在解决方案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM