Локальные сети персональных компьютеров. Работа с сервером Novell NetWare© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 168 стр. 3.5. Просмотр и изменение атрибутовДля просмотра маски прав доступа каталога можно использовать функцию GetEffectiveDirectoryRights(): int GetEffectiveDirectoryRights(BYTE DirectoryHandle, char *DirectoryPath, BYTE *EffectiveRightsMask); Параметры DirectoryHandle и DirectoryPath задают путь к каталогу, маску прав которого вам нужно получить. Параметр EffectiveRightsMask - указатель на байт памяти, в который будет записан байт маски прав доступа. Функция возвращает нулевое значение или код ошибки:
Функция SetDirectoryInformation() позволяет задать новые значения для времени и даты создания каталога, идентификатора пользователя, создавшего каталог и изменить маску прав доступа каталога: int SetDirectoryInformation(BYTE DirectoryHandle, char *DirectoryPath, BYTE *NewCreationDateAndTime, long NewOwnerObjectID, BYTE MaximumRightsMask); Параметры DirectoryHandle и DirectoryPath задают путь к нужному нам каталогу. Параметр NewCreationDateAndTime указывает на массив из четырех байт с новыми значениями даты и времени. Формат этого массива мы рассматривали ранее в разделе, посвященном определению содержимого сетевых каталогов (см. рис. 1). Параметр NewOwnerObjectID задает идентификатор нового владельца каталога. Этот идентификатор должен быть определен в базе объектов операционной системы Novell NetWare. Параметр MaximumRightsMask задает новое значение для маски прав доступа каталога. Функция возвращает нулевое значение или код ошибки:
Учтите, что для успешного выполнения функции SetDirectoryInformation() пользователь должен иметь права на изменение атрибутов каталога. Сменить же владельца каталога может только пользователь с правами супервизора. Если вам нужно изменить только маску прав доступа каталога, удобно воспользоваться функцией ModifyMaximumRightsMask(): int ModifyMaximumRightsMask(BYTE DirectoryHandle, char *DirectoryPath, BYTE RevokeRightsMask, BYTE GrantRightsMask); Параметры DirectoryHandle и DirectoryPath задают путь к каталогу, маску которого необходимо изменить. Параметр RevokeRightsMask задает удаляемые права доступа, а параметр GrantRightsMask - добавляемые. Программа, использующая эту функцию, должна иметь права на изменение атрибутов каталога, в противном случае маска прав доступа каталога изменена не будет. Функция возвращает нулевое значение или код
ошибки:
Для того чтобы получить права доступа к каталогу вместо функции GetEffectiveDirectoryRights() можно использовать функцию E2h прерывания INT 21h:
Буфер запроса имеет следующий формат: 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 или код ошибки. 3.5.1. Программа GETMASKПрограмма GETMASK (листинг 15) показывает байт маски прав доступа для каталога, путь к которому задан в качестве параметра при запуске программы. // =================================================== // Листинг 15. Просмотр маски прав доступа к каталогу // Файл getmask\getmask.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #define BYTE unsigned char #define WORD unsigned int extern "C" int GetNetWareShellVersion(char *,char *, char *); extern "C" int GetEffectiveDirectoryRights(BYTE, char*, BYTE*); void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; BYTE RightsMask; int ccode; printf("\n*GETMASK* (C) Frolov A., 1993\n"); // Проверяем наличие сетевой оболочки asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision); asm pop si if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; } // Необходимо задать букву, обозначающую имя // локального диска и путь к сетевому каталогу if(argc < 2) { printf("Укажите путь к каталогу, " "\nнапример: getmask sys:users"); return; } // Параметр должен быть задан заглавными буквами strupr(argv[1]); // Удаляем каталог ccode = GetEffectiveDirectoryRights(0, argv[1], &RightsMask); if(!ccode) { printf("Права доступа: %02.2X\n", RightsMask); if(RightsMask & 0x01) printf("Read\t(Чтение)\n"); if(RightsMask & 0x02) printf("Write\t(Запись)\n"); if(RightsMask & 0x04) printf( "Open\t(Открытие файлов)\n"); if(RightsMask & 0x08) printf("Create\t(Создание)\n"); if(RightsMask & 0x10) printf("Delete\t(Уничтожение)\n"); if(RightsMask & 0x20) printf("Parential\t" "(Определение прав)\n"); if(RightsMask & 0x40) printf("Search\t(Поиск)\n"); if(RightsMask & 0x80) printf("Modify\t" "(Изменение атрибутов)\n"); } else printf("Ошибка %02.2X\n", ccode); } 3.5.2. Программа SETMASKПрограмма SETMASK (листинг 16) демонстрирует использование функции ModifyMaximumRightsMask() для изменения маски прав доступа существую-щего каталога. В качестве первого параметра программе необходимо указать путь к каталогу. Второй и третий параметр задают соответственно удаляемые или добавляемые права доступа. // =================================================== // Листинг 16. Изменение маски прав доступа // Файл setmask\setmask.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #define BYTE unsigned char #define WORD unsigned int extern "C" int GetNetWareShellVersion(char *,char *, char *); extern "C" int ModifyMaximumRightsMask(BYTE, char*, BYTE,BYTE); void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; BYTE RevokeRightsMask; BYTE GrantRightsMask; int ccode; printf("\n*SETMASK* (C) Frolov A., 1993\n"); // Проверяем наличие сетевой оболочки asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision); asm pop si if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; } // Необходимо задать путь к каталогу, удаляемые // и добавляемые права доступа if(argc < 4) { printf("Укажите путь к каталогу, " "удаляемые и добавляемые права доступа, " "\nнапример: setmask sys:users W RO"); return; } // Параметры должны быть заданы заглавными буквами strupr(argv[1]); strupr(argv[2]); strupr(argv[3]); // Определяем маску удаляемых прав, разбирая второй // параметр, заданный при запуске программы RevokeRightsMask = 0x00; for(int i = 0; argv[2][i] != '\0' ; i++) { switch(argv[2][i]) { case 'R': RevokeRightsMask |= 1; break; case 'W': RevokeRightsMask |= 2; break; case 'O': RevokeRightsMask |= 4; break; case 'C': RevokeRightsMask |= 8; break; case 'D': RevokeRightsMask |= 0x10; break; case 'P': RevokeRightsMask |= 0x20; break; case 'S': RevokeRightsMask |= 0x40; break; case 'M': RevokeRightsMask |= 0x80; break; case '-': break; default: printf("Ошибка в параметрах\n"); return; } } // Определяем маску добавляемых прав, разбирая // третий параметр, заданный при запуске программы GrantRightsMask = 0x00; for(i = 0; argv[3][i] != '\0' ; i++) { switch(argv[3][i]) { case 'R': GrantRightsMask |= 1; break; case 'W': GrantRightsMask |= 2; break; case 'O': GrantRightsMask |= 4; break; case 'C': GrantRightsMask |= 8; break; case 'D': GrantRightsMask |= 0x10; break; case 'P': GrantRightsMask |= 0x20; break; case 'S': GrantRightsMask |= 0x40; break; case 'M': GrantRightsMask |= 0x80; break; case '-': break; default: printf("Ошибка в параметрах\n"); return; } } // Изменяем маску доступа каталога ccode = ModifyMaximumRightsMask(0, argv[1], RevokeRightsMask, GrantRightsMask); if(!ccode) printf("Маска прав изменена\n"); else printf("Ошибка %02.2X\n", ccode); } |