[英]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.