На главную страницу


View in English


Как определить права доступа к файлу/каталогу на томе NTFS в Windows NT/2000

Известно, что самый простой способ определения прав доступа к файлу - попробовать воспользоваться соответствующим правом. Если в праве будет отказано системой - значит, текущий пользователь такого права не имеет. Но иногда такой подход является невозможным или нежелательным. Например, нужно узнать, имеется ли право на удаление определенного файла, не удаляя его, или требуется выяснить права доступа к открытому файлу.

В Windows NT/2000 существует функция API AccessCheck, которая, собственно, и проверяет права доступа к объекту операционной системы, поддерживающему права доступа. Эта функция неявно вызывается системой каждый раз при обращении к такому объекту. Чтобы явно вызвать функцию AccessCheck, нужно проделать целый ряд непростых манипуляций над структурами данных, отвечающими за безопасность ОС, вызвав несколько других функций API.

Для упрощения работы с правами доступа к объектам файловой системы NTFS (файлы, каталоги) я написал функцию CheckFileAccess, которая берет всю трудную работу на себя.

Вот описание этой функции:

    CheckFileAccess(Filename As String, _
        ByVal DesiredAccess As Long) As Long,

где:

    Filename      - полный путь к файлу или каталогу.
                    Путь к каталогу не должен заканчиваться символом "\".

    DesiredAccess - битовая маска запрашиваемых прав доступа.

Функция возвращает битовую маску, состоящую из тех битов запрошенной маски, которые соответствуют разрешенным правам доступа. В случае, если права доступа к указанному файлу не поддерживаются, возвращается значение -1.

В качестве запрашиваемых прав доступа можно использовать любую комбинацию с помощью оператора OR констант, приведенных в начале листинга функции CheckFileAccess. Наиболее часто употребляемыми из них являются:

    FILE_GENERIC_READ    - доступ на чтение,

    FILE_GENERIC_WRITE   - доступ на запись,

    FILE_GENERIC_EXECUTE - доступ на исполнение,

    DELETE               - доступ на удаление,

    WRITE_DAC            - доступ на изменение прав доступа,

    WRITE_OWNER          - доступ на смену владельца,

    FILE_ALL_ACCESS      - полный доступ,

    MAXIMUM_ALLOWED      - максимально возможный доступ.

Можно также использовать константы, применимые к любым объектам ОС:

    GENERIC_READ         - доступ на чтение,

    GENERIC_WRITE        - доступ на запись,

    GENERIC_EXECUTE      - доступ на исполнение,

    GENERIC_ALL          - полный доступ,

но в этом случае результатом функции будут, соответственно, значения FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS (разумеется, при наличии соответствующих прав).

Чтобы выяснить, например, имеются ли права на доступ к файлу "d:\Test.tmp" на чтение и на запись, можно пойти двумя путями:

Путь 1:

Dim AccessRead As Boolean, AccessWrite As Boolean
    AccessRead = CheckFileAccess("d:\Test.tmp", _
                 FILE_GENERIC_READ) = FILE_GENERIC_READ
    AccessWrite = CheckFileAccess("d:\Test.tmp", _
                 FILE_GENERIC_WRITE) = FILE_GENERIC_WRITE

Путь 2:

Dim AccessRead As Boolean, AccessWrite As Boolean
Dim AccessMask As Long
    AccessMask = CheckFileAccess("d:\Test.tmp", MAXIMUM_ALLOWED)
    AccessRead = (AccessMask _
                 And FILE_GENERIC_READ) = FILE_GENERIC_READ
    AccessWrite = (AccessMask _
                 And FILE_GENERIC_WRITE) = FILE_GENERIC_WRITE

В первом случае дважды вызывается функция CheckFileAccess, во втором - используется промежуточная переменная.

Для иллюстрации использования функции CheckFileAccess я написал программу - пример FilePerm.exe, которая отображает права доступа к файлу или каталогу операционной системы.

Файл или каталог можно задать в качестве параметра командной строки, перетащить из Проводника или ввести в соответствующее текстовое поле. Файл можно также открыть, выбрав его в окне обзора нажатием кнопки "...".

Исходный код этой программы на Visual Basic 5.0 с подробными комментариями прилагается.

См. также Microsoft Knowledge Base Q115945.

Загрузить исходный код программы FilePerm.exe
fileperm.zip (19 кБ, интерфейс на английском языке)

Эта страница обновлялась в последний раз 17 янв 2000 г.
© 2000 Сергей Мерзликин
Пишите: