Обнаружение значения FileSystemRights, которое не определено в перечислении - PullRequest
9 голосов
/ 14 марта 2012

Я написал приложение, которое проверяет все разрешения файловой системы для каталога.

Каталог имеет ряд правил доступа (типа FileSystemAccessRule).

КаждыйПравило доступа имеет свойство FileSystemRights, которое является перечислением флагов.

При выполнении этого я постоянно сталкиваюсь со значением FileSystemRights 268435456 (которое доходит до 0x10000000 в шестнадцатеричном формате).

Это значение просто не отображается в перечислении!Это на самом деле выше, чем максимальное значение одиночного флага (Synchronize, имеющее значение 0x100000).

Кто-нибудь знает, что это такое?

Ответы [ 3 ]

12 голосов
/ 14 марта 2012

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

С этой страницы:

Используя .NET, вы можете подумать, что определить, какие разрешения назначены для каталога / файла, должно быть довольно легко, так какявляется определенным перечислением FileSystemRights, которое, по-видимому, содержит все возможные разрешения, которые могут иметь файл / каталог, а вызов AccessRule.FileSystemRights возвращает комбинацию этих значений.Однако вскоре вы столкнетесь с некоторыми разрешениями, когда значение в этом свойстве не совпадает ни с одним из значений в перечислении FileSystemRights (я бы хотел, чтобы они не называли некоторые свойства с тем же именем, что и тип, но все же).

Конечным результатом этого является то, что для некоторых файлов / каталогов вы просто не можете определить, какие разрешения им назначены.Если вы делаете AccessRule.FileSystemRights.ToString, то для этих значений вы видите только число, а не описание (например, Modify, Delete, FullControl и т. Д.).Общие числа, которые вы можете увидеть:

-1610612736, –536805376 и 268435456

Чтобы выяснить, каковы эти разрешения на самом деле, вам нужно посмотреть, какие биты установлены, когда вы обрабатываете это числокак 32 отдельных бита, а не как целое число (поскольку целые числа имеют длину 32 бита), и сравните их с этой схемой: http://msdn.microsoft.com/en-us/library/aa374896(v=vs.85).aspx

Так, например, -1610612736 имеет первый бит и третий бит, установленные,это означает, что это GENERIC_READ в сочетании с GENERIC_EXECUTE.Теперь вы можете преобразовать эти общие разрешения в определенные разрешения файловой системы, которым они соответствуют.

Здесь вы можете увидеть, с какими разрешениями сопоставлено каждое общее разрешение: http://msdn.microsoft.com/en-us/library/aa364399.aspx. Просто имейте в виду, что STANDARD_RIGHTS_READ, STANDARD_RIGHTS_EXECUTEи STANDARD_RIGHTS_WRITE - это одно и то же (понятия не имею, почему, мне это кажется странным), и фактически они равны значению FileSystemRights.ReadPermissions.

4 голосов
/ 18 ноября 2014

от https://social.technet.microsoft.com/Forums/windowsserver/en-US/5211a077-63fc-4016-b750-25bf26b3ad15/why-does-getacl-return-filesystemrights-that-are-invalid-in-filesystemaccesrule-used-with-setacl?forum=winserverpowershell

268435456 - FullControl

-536805376 - Изменить, синхронизировать

-1610612736 - ReadAndExecute, Synchronize

(чтобы сэкономить немного математики)

2 голосов
/ 20 ноября 2015

Вот мое решение для исправления FileSystemRights, чтобы они соответствовали перечислению.

Есть несколько документов об этом.Ссылки включены в код.

    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;
    }
...