Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

Просмотр и изменение атрибутов


Для просмотра маски прав доступа каталога можно использовать функцию GetEffectiveDirectoryRights(): int GetEffectiveDirectoryRights(BYTE DirectoryHandle, char *DirectoryPath, BYTE *EffectiveRightsMask);
Параметры DirectoryHandle и DirectoryPath задают путь к каталогу, маску прав которого вам нужно получить. Параметр EffectiveRightsMask - указатель на байт памяти, в который будет записан байт маски прав доступа.
Функция возвращает нулевое значение или код ошибки:
Код ошибкиЗначение
0x98Указанный при создании каталога том не существует
0x9BНеправильно задан индекс каталога в параметре DirectoryHandle

Функция SetDirectoryInformation() позволяет задать новые значения для времени и даты создания каталога, идентификатора пользователя, создавшего каталог и изменить маску прав доступа каталога: int SetDirectoryInformation(BYTE DirectoryHandle, char *DirectoryPath, BYTE *NewCreationDateAndTime, long NewOwnerObjectID, BYTE MaximumRightsMask);
Параметры DirectoryHandle и DirectoryPath задают путь к нужному нам каталогу.
Параметр NewCreationDateAndTime указывает на массив из четырех байт с новыми значениями даты и времени. Формат этого массива мы рассматривали ранее в разделе, посвященном определению содержимого сетевых каталогов (см. Рисунок 1).


Параметр NewOwnerObjectID задает идентификатор нового владельца каталога. Этот идентификатор должен быть определен в базе объектов операционной системы Novell NetWare.
Параметр MaximumRightsMask задает новое значение для маски прав доступа каталога.
Функция возвращает нулевое значение или код ошибки:
Код ошибкиЗначение
0x9BНеправильно задан индекс каталога в параметре DirectoryHandle
0x9CНеправильно задан путь к каталогу

Учтите, что для успешного выполнения функции SetDirectoryInformation() пользователь должен иметь права на изменение атрибутов каталога. Сменить же владельца каталога может только пользователь с правами супервизора.
Если вам нужно изменить только маску прав доступа каталога, удобно воспользоваться функцией ModifyMaximumRightsMask(): int ModifyMaximumRightsMask(BYTE DirectoryHandle, char *DirectoryPath, BYTE RevokeRightsMask, BYTE GrantRightsMask);
Параметры DirectoryHandle и DirectoryPath задают путь к каталогу, маску которого необходимо изменить.
Параметр RevokeRightsMask задает удаляемые права доступа, а параметр GrantRightsMask - добавляемые.
Программа, использующая эту функцию, должна иметь права на изменение атрибутов каталога, в противном случае маска прав доступа каталога изменена не будет.
Функция возвращает нулевое значение или код ошибки:

Код ошибкиЗначение
0x8СУ программы нет прав для изменения атрибутов
0x98Указанный при создании каталога том не существует
0x9CНеправильно задан путь к каталогу

Для того чтобы получить права доступа к каталогу вместо функции GetEffectiveDirectoryRights() можно использовать функцию E2h прерывания INT21h:
На входе:AH= E2h;
DS:SI= Адрес буфера запроса;
ES:DI= Адрес буфера ответа.
На выходе:AL= Код ошибки или 0, если операция завершилась без ошибок.

Буфер запроса имеет следующий формат: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 3 BYTE DirectoryHandle; // индекс каталога BYTE PathLength; // длина поля пути BYTE DirectoryPath[PathLength]; // путь к каталогу };
Приведем формат буфера ответа: struct REPLAY { WORD PacketLength; // размер пакета BYTE EffectiveRightsMask; // права доступа };
Для изменения атрибутов каталога вместо функции SetDirectoryInformation() вы также можете использовать функцию E2h прерывания INT 21h, заполнив буфер запроса следующим образом: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 25 BYTE DirectoryHandle; // индекс каталога BYTE NewCreationDateAndTime[4]; // новые дата и время long NewOwnerObjectID; // идентификатор владельца BYTE MaximumRightsMask; // маска прав доступа BYTE PathLength; // длина поля пути BYTE DirectoryPath[PathLength]; // путь к каталогу };
Если вам надо изменить маску прав доступа для существующего каталога, вы можете воспользоваться той же самой функцией прерывания INT 21h. Приведем формат соответствующего буфера запроса: struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 4 BYTE DirectoryHandle; // индекс каталога BYTE RevokeRightsMask; // удаляемые права доступа BYTE GrantRightsMask; // добавляемые права доступа BYTE PathLength; // длина поля пути BYTE DirectoryPath[PathLength]; // путь к каталогу };
Во всех описанных случаях после вызова прерывания INT 21h регистр AL содержит 0 или код ошибки.

Содержание раздела