2012-03-14 21 views
8

Tôi đã viết một ứng dụng kiểm tra tất cả quyền của hệ thống tệp trên một thư mục.Gặp phải giá trị FileSystemRights không được xác định trong liệt kê

Một thư mục có một số quy tắc truy cập (thuộc loại FileSystemAccessRule).

Mỗi quy tắc truy cập có thuộc tính FileSystemRights, đây là một điều tra cờ.

Khi chạy điều này, tôi tiếp tục gặp phải một giá trị FileSystemRights của 268435456 (đến số 0x10000000 trong hệ thập lục phân).

Giá trị này chỉ không xuất hiện trong điều tra! Nó thực sự cao hơn giá trị cờ đơn cao nhất (Synchronize, có giá trị là 0x100000).

Có ai biết đây là gì không?

Trả lời

11

Xem http://cjwdev.wordpress.com/2011/06/28/permissions-not-included-in-net-accessrule-filesystemrights-enum/

Từ trang đó:

Sử dụng .NET bạn có thể nghĩ rằng việc xác định quyền được gán cho một thư mục/tập tin nên được khá dễ dàng, như có một FileSystemRights Enum được định nghĩa dường như chứa mọi quyền hạn có thể của rằng một tệp/thư mục có thể có và gọi AccessRule.FileSystemRights trả về kết hợp các giá trị này. Tuy nhiên, bạn sẽ sớm gặp một số quyền khi giá trị trong thuộc tính này không khớp với bất kỳ giá trị nào trong FileSystemRights Enum (Tôi muốn họ không đặt tên cho một số thuộc tính có cùng tên làm Loại nhưng hey).

Kết quả cuối cùng của việc này là đối với một số tệp/thư mục bạn chỉ cần không thể xác định quyền nào được gán cho chúng. Nếu bạn thực hiện AccessRule.FileSystemRights.ToString thì đối với các giá trị này, tất cả những gì bạn nhìn thấy là một số thay vì mô tả (ví dụ: Sửa đổi, Xóa, FullControl v.v.). số chung bạn có thể thấy là:

-1610612736, -536.805.376, và 268435456

Để làm việc ra những gì các điều khoản thực sự là, bạn cần phải nhìn vào mà bit được thiết lập khi bạn đối xử với con số đó là 32 riêng bit chứ không phải là một Integer (như số nguyên dài 32 bit), và so sánh họ sơ đồ này: http://msdn.microsoft.com/en-us/library/aa374896(v=vs.85).aspx

vì vậy, ví dụ, -1610612736 có bit đầu tiên và bit set thứ ba, có nghĩa là nó được GENERIC_READ kết hợp với GENERIC_EXECUTE. Vì vậy, bây giờ bạn có thể chuyển đổi các quyền chung thành tệp cụ thể quyền hệ thống mà chúng tương ứng.

Bạn có thể xem các quyền mà mỗi quyền chung cho phép bản đồ tại đây: http://msdn.microsoft.com/en-us/library/aa364399.aspx. Chỉ cần lưu ý rằng rằng STANDARD_RIGHTS_READ, STANDARD_RIGHTS_EXECUTE và STANDARD_RIGHTS_WRITE đều giống nhau (không biết tại sao, có vẻ như lạ đối với tôi) và thực sự tất cả đều bằng FileSystemRights.Giá trị ReadPermissions.

2

Đây là giải pháp của tôi để sửa FileSystemRights chúng phù hợp với điều tra.

Có một số tài liệu về điều đó. Các tham chiếu được bao gồm trong mã.

public static FileSystemRights FileSystemRightsCorrector(FileSystemRights fsRights, bool removeSynchronizePermission = false) 
    { 
     // from: https://msdn.microsoft.com/en-us/library/aa374896%28v=vs.85%29.aspx 
     const int C_BitGenericRead = (1 << 31); 
     const int C_BitGenericWrite = (1 << 30); 
     const int C_BitGenericExecute = (1 << 29); 
     const int C_BitGenericAll = (1 << 28); 


     // https://msdn.microsoft.com/en-us/library/aa364399.aspx 
     // FILE_GENERIC_READ = FILE_READ_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | STANDARD_RIGHTS_READ | SYNCHRONIZE 
     // FILE_GENERIC_WRITE = FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_DATA | FILE_WRITE_EA | STANDARD_RIGHTS_WRITE | SYNCHRONIZE 
     // FILE_GENERIC_EXECUTE = FILE_EXECUTE | FILE_READ_ATTRIBUTES | STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE 

     //from Winnt.h 
     //#define STANDARD_RIGHTS_READ    (READ_CONTROL) 
     //#define STANDARD_RIGHTS_WRITE   (READ_CONTROL) 
     //#define STANDARD_RIGHTS_EXECUTE   (READ_CONTROL) 

     // from: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379607%28v=vs.85%29.aspx 
     // READ_CONTROL = "The right to read the information in the object's security descriptor," 
     // ==> STANDARD_RIGHTS_READ, STANDARD_RIGHTS_WRITE, STANDARD_RIGHTS_EXECUTE == FileSystemRights.ReadPermissions 

     // translation for the generic rights to the FileSystemRights enum 
     const FileSystemRights C_FsrGenericRead = FileSystemRights.ReadAttributes | FileSystemRights.ReadData | FileSystemRights.ReadExtendedAttributes | FileSystemRights.ReadPermissions | FileSystemRights.Synchronize; 
     const FileSystemRights C_FsrGenericWrite = FileSystemRights.AppendData | FileSystemRights.WriteAttributes | FileSystemRights.WriteData | FileSystemRights.WriteExtendedAttributes | FileSystemRights.ReadPermissions | FileSystemRights.Synchronize; 
     const FileSystemRights C_FsrGenericExecute = FileSystemRights.ExecuteFile | FileSystemRights.ReadAttributes | FileSystemRights.ReadPermissions | FileSystemRights.Synchronize; 

     if (((int)fsRights & C_BitGenericRead) != 0) 
     { 
      fsRights |= C_FsrGenericRead; 
     } 

     if (((int)fsRights & C_BitGenericWrite) != 0) 
     { 
      fsRights |= C_FsrGenericWrite; 
     } 

     if (((int)fsRights & C_BitGenericExecute) != 0) 
     { 
      fsRights |= C_FsrGenericExecute; 
     } 

     if (((int)fsRights & C_BitGenericAll) != 0) 
     { 
      fsRights |= FileSystemRights.FullControl; 
     } 

     // delete the 4 highest bits if present 
     fsRights = (FileSystemRights)((int)fsRights & ~(C_BitGenericRead | C_BitGenericWrite | C_BitGenericExecute | C_BitGenericAll)); 

     // for some purposes the "Synchronize" flag must be deleted 
     if (removeSynchronizePermission == true) 
     { 
      fsRights = (FileSystemRights)((int)fsRights & ~((int)FileSystemRights.Synchronize)); 
     } 

     return fsRights; 
    }