Локальные сети персональных компьютеров. Работа с сервером 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);
}
|

