簡體   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