使用 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 上,我删除了除我的用户帐户之外的所有权限。请注意,至少需要一个组或用户帐户才能授予访问权限。
我需要将安全权限从一个文件夹复制到一堆文件夹。
我需要更改大量子文件夹的权限。我想从具有正确安全设置的现有文件夹复制权限。 代码运行没有错误,但没有任何变化。如果我创建现有文件夹的副本,权限就可以了。
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 上,我删除了除我的用户帐户之外的所有权限。请注意,至少需要一个组或用户帐户才能授予访问权限。