【问题标题】:Copying directory permissions with C#使用 C# 复制目录权限
【发布时间】:2020-01-27 17:14:18
【问题描述】:

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

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

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

【问题讨论】:

  • "SetAccessControl方法只持久化对象创建后被修改过的DirectorySecurity对象。如果一个DirectorySecurity对象没有被修改过,就不会持久化到文件中。因此,它不是可以从一个文件中检索 DirectorySecurity 对象并将同一对象重新应用到另一个文件" - 来自remarks。进一步是做什么。

标签: c# windows directory user-permissions


【解决方案1】:

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

Directory.SetAccessControl Method Remarks

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

首先是问题

您不能直接使用一个文件/文件夹中的 DirectorySecutrity 对象,然后仅使用 GetAccessControl/SetAccessControl 将其应用到另一个文件/文件夹。

来自微软:

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

现在的解决方案

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

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

【讨论】:

  • 在本地文件夹上效果很好,但不幸的是我想更改共享驱动器上文件夹的安全设置。我收到The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation 错误。似乎我需要路径中所有文件夹的权限,但我只有链中最后一个文件夹的权限。我以管理员身份运行该过程,但没有帮助。不过我可以手动设置安全设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2015-05-29
  • 2010-09-30
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多