2012-09-10 36 views
5

Tôi đã cố gắng cấp quyền NTFS trên đường dẫn UNC cho một người dùng cụ thể, nhưng tôi thấy hành vi khác nhau tùy thuộc vào đường dẫn UNC. Dưới đây là mã (từ MSDN) mà tôi đang sử dụng để cung cấp cho phép và kết quả trong mỗi kịch bản,Quyền thừa kế bị mất khi cấp quyền NTFS

static void GiveNTFSPermissions(string folderPath, 
           string ntAccountName, 
           FileSystemRights accessRights) 
{ 
    DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath); 

    FileSystemAccessRule newAccessRule = 
     new FileSystemAccessRule(
       ntAccountName, 
       accessRights, 
       AccessControlType.Allow); 

    dirSecurity.AddAccessRule(newAccessRule); 

    Directory.SetAccessControl(folderPath, dirSecurity); 
} 

Giả sử tôi có một phần có tên là “RootShare” trên máy tính địa phương của tôi, và một thư mục “InsideRootShare ”bên trong nó.

Scenario1: Khi tôi gọi,

GiveNTFSPermissions(@"\\sri-devpc\RootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

quyền thừa kế đã bị mất trên con đường chia sẻ,

Scenario2: Khi tôi gọi,

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

Quyền thừa kế vẫn còn nguyên vẹn.

Tôi đã thử với các nhà thầu khác nhau của FileSystemAccessRule nhưng không có may mắn.

Lý do đằng sau hành vi này và bất kỳ giải pháp nào cho điều này?

+0

Bạn đã thử [hàm tạo] (http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule.aspx) có tham số 'InheritanceFlags' làm đối số? Ngoài ra, 'AddNTFSPermission' là một tên hợp lý hơn' GiveNTFSPermissions', vì nó cố gắng * thêm * một quy tắc truy cập mới vào các quy tắc truy cập hiện có. – Nawaz

+0

Xem chủ đề này: http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista – Nawaz

+0

@Nawaz: Tôi đã thử tất cả các nhà xây dựng và tôi có cùng kết quả. Cảm ơn bạn đã đề xuất :) – sri

Trả lời

4

Chúng tôi gặp sự cố tương tự khi làm việc với quyền của hệ thống tệp trong khi làm việc trên mô-đun bảo mật của Dropkick. Giải pháp chúng tôi đưa ra là như sau. Điều này sẽ đặt thành công quyền trên bất kỳ thư mục nào mà không thay đổi các quy tắc thừa kế trên thư mục.

public void SetFileSystemRights(string target, string group, FileSystemRights permission) 
    { 
     if (!IsDirectory(target) && !IsFile(target)) 
      return; 

     var oldSecurity = Directory.GetAccessControl(target); 
     var newSecurity = new DirectorySecurity(); 

     newSecurity.SetSecurityDescriptorBinaryForm(oldSecurity.GetSecurityDescriptorBinaryForm()); 

     var accessRule = new FileSystemAccessRule(group, 
                permission, 
                InheritanceFlags.None, 
                PropagationFlags.NoPropagateInherit, 
                AccessControlType.Allow); 
     bool result; 
     newSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

     if (!result) Log.AddError("Something wrong happened"); 

     accessRule = new FileSystemAccessRule(group, 
               permission, 
               InheritanceFlags.ContainerInherit | 
               InheritanceFlags.ObjectInherit, 
               PropagationFlags.InheritOnly, 
               AccessControlType.Allow); 

     result = false; 
     newSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out result); 
     if (!result) Log.AddError("Something wrong happened"); 

     Directory.SetAccessControl(target, newSecurity); 

     if (result) Log.AddGood("Permissions set for '{0}' on folder '{1}'", group, target); 

     if (!result) Log.AddError("Something wrong happened"); 
    } 

Tìm thấy the link that I originally used to figure this out.

Các vấn đề liên quan