2012-04-10 22 views
6

Tôi đang viết một tiện ích nhỏ trong C# để đảm bảo một thư mục được chỉ định và tất cả nội dung của nó có quyền truy cập thích hợp (tôi muốn cấp cho toàn quyền truy cập nhóm Authenticated Users). Các mã sau đây dường như làm việc đúng cách để cập nhật ACL mức thư mục hàng đầu (Access Control List):Cách xem liệu "bao gồm các quyền thừa kế" có được bỏ chọn cho một tệp hoặc thư mục không?

SecurityIdentifier allUsers = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 
FileSystemAccessRule newRule = new FileSystemAccessRule(allUsers, 
    FileSystemRights.FullControl, iFlags, 
    PropagationFlags.None, AccessControlType.Allow); 

DirectoryInfo info = new DirectoryInfo(folderPath); 
DirectorySecurity security = info.GetAccessControl(); 
security.AddAccessRule(newRule); 
info.SetAccessControl(security); 

tôi đã nhận thấy, tuy nhiên, quy tắc truy cập mới này không tuyên truyền để các thư mục con có "Bao gồm quyền truy cập được phép… "tùy chọn không được chọn trong thuộc tính bảo mật của chúng. Điều đó chỉ có ý nghĩa. Vì vậy, những gì tôi muốn làm là chuyển quyền thừa kế quyền bảo mật trở lại cho bất kỳ thư mục con như vậy.

Việc đào của tôi đã phát hiện ra phương pháp ObjectSecurity.SetAccessRuleProtection cần phải bằng một nửa những gì tôi cần. Tuy nhiên, nó có vẻ cẩu thả để chỉ sử dụng một cách mù quáng phương pháp trên trên các đối tượng đã thừa hưởng DACL của cha mẹ của họ. Vì vậy, tôi muốn xác định các đối tượng có quyền thừa kế quyền của họ bị tắt, nhưng tôi dường như không thể tìm thấy phương thức hoặc thuộc tính tương ứng trả về thông tin này. Có cái nào không? Am i thiếu cái gì ở đây?

+0

Tại sao nó quan trọng nếu một thư mục mẹ đã có nó thiết lập? Đặt lại lần nữa sẽ không gây ra bất kỳ đau buồn nào. –

+0

@ M.Babcock - Vì lý do thực tế, có vẻ như lãng phí và không hiệu quả để buộc cập nhật tệp hoặc thư mục không cần cập nhật. Trong trường hợp cụ thể của tôi, chỉ có một vài thư mục con * không * kế thừa quyền truy cập, nhưng có hàng trăm hoặc thậm chí hàng nghìn tệp trong cùng một thư mục * làm *. Vì lý do hiệu suất, tôi sẽ cập nhật một số ít các đối tượng này hơn tất cả chúng. – Jeremy

+1

Mặc dù không phải là bản sao, nó là nghịch đảo của http://stackoverflow.com/questions/6574196/programatically-removing-include-inheritable-permissions-from-this-objects-par – emd

Trả lời

4

Tôi nhớ sử dụng một cái gì đó như thế này:

Tôi cũng đã cố gắng để tìm một phương pháp để kiểm tra điều này, nhưng tôi không thể tìm thấy bất kỳ (ngay cả trong C++). Vì vậy, tôi đã kết thúc bằng cách sử dụng mã ở trên. Nó làm việc như một say mê.

+0

Dường như một sự giám sát từ MS đến không cung cấp một phương pháp trực tiếp hơn để kiểm tra điều này, nhưng đây chính xác là những gì tôi đang tìm kiếm. :) – Jeremy

+1

Ví dụ của bạn chỉ hiển thị 'nếu threre là một cái gì đó được thừa hưởng' và' không hiển thị nếu kế thừa được bật'. Đây là sự khác biệt khi thư mục cha chỉ truyền bá quyền cho thư mục mẹ (và không phải cho thư mục con hoặc tệp) hoặc khi ACL bị hỏng. Trong cả hai trường hợp, bạn sẽ nhận được 'không thừa kế ngay cả khi nó được bật'. – boboes

1

Có vẻ như có một cách quản lý để làm điều này:

DirectorySecurity ds = System.IO.Directory.GetAccessControl(@"C:\test"); 
byte[] rawBytes = ds.GetSecurityDescriptorBinaryForm(); 
RawSecurityDescriptor rsd = new RawSecurityDescriptor(rawBytes, 0); 

if ((rsd.ControlFlags & ControlFlags.DiscretionaryAclProtected) == 
         ControlFlags.DiscretionaryAclProtected) 
{ 
    // "Include inheritable permissions from this object's parent" is unchecked 
} 
else 
{ 
    // "Include inheritable permissons from this object's parent" is checked 
} 
Các vấn đề liên quan