2012-03-14 10 views
8

Napisałem aplikację, która sprawdza wszystkie uprawnienia systemu plików w katalogu.Napotkanie wartości FileSystemRights, która nie jest zdefiniowana w wyliczeniu

Katalog ma wiele reguł dostępu (typu FileSystemAccessRule).

Każda reguła dostępu ma właściwość FileSystemRights, która jest wyliczeniem flagi.

Podczas tej operacji napotykam na wartość FileSystemRights o wartości 268435456 (która przychodzi do 0x10000000 w systemie szesnastkowym).

Ta wartość nie pojawia się po wyliczeniu! Jest w rzeczywistości wyższa niż najwyższa wartość pojedynczej flagi (Synchronize, o wartości 0x100000).

Czy ktoś wie, co to jest?

Odpowiedz

11

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

Od tej strony:

Korzystanie .NET można pomyśleć, że określenia, które uprawnienia są przypisany do katalogu/pliku powinno być dość łatwe, ponieważ istnieje FileSystemRights Enum Zdefiniowano, że wydaje się zawierać wszystkie możliwe uprawnienia, które plik/katalog może mieć i wywoływanie: AccessRule.FileSystemRights zwraca kombinację tych wartości. Wkrótce jednak natkniesz się na pewne uprawnienia, których wartość w ta właściwość nie pasuje do żadnej z wartości w Enum FileSystemRights (szkoda, że ​​nie nazwałaby niektórych nieruchomości o tej samej nazwie jako typ, ale hej).

Rezultatem jest to, że w przypadku niektórych plików/katalogów po prostu nie można ustalić, które uprawnienia są do nich przypisane. Jeśli wykonasz AccessRule.FileSystemRights.ToString, wówczas dla tych wartości widzisz tylko numer, a nie opis (np. Modyfikuj, Usuń, FullControl itd.). Wspólne numery można zobaczyć są:

-1610612736, -536.805.376 i 268435456

Aby zorientować, co właściwie są te uprawnienia, trzeba spojrzeć na które ustawione są bity, gdy traktują tę liczbę jako 32 oddzielny bity niż jako liczba całkowita (jako liczby całkowite są 32 bitów), i porównać je z tym schemacie: http://msdn.microsoft.com/en-us/library/aa374896(v=vs.85).aspx

tak na przykład -1610612736 ma pierwszy bit i trzeciego zestawu bitów, co oznacza, że ​​ to GENERIC_READ w połączeniu z GENERIC_EXECUTE. Teraz możesz konwertować te ogólne uprawnienia na określone uprawnienia systemowe, które odpowiadają.

Możesz zobaczyć, które uprawnienia są dostępne dla każdej mapy uprawnień ogólnych: http://msdn.microsoft.com/en-us/library/aa364399.aspx. Po prostu pamiętaj o tym, że STANDARD_RIGHTS_READ, STANDARD_RIGHTS_EXECUTE i STANDARD_RIGHTS_WRITE to wszystko to samo (nie mam pojęcia dlaczego, wydaje mi się dziwne dla mnie ) i faktycznie wszystkie są równe FileSystemRights.Wartość ReadPermissions.

2

Oto moje rozwiązanie do poprawiania FileSystemRights tak pasują do wyliczenia.

Istnieje kilka dokumentów na ten temat. Odniesienia są zawarte w kodzie.

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; 
    } 
Powiązane problemy