Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 168 стр.

[Назад] [Содеожание] [Дальше]

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

Для просмотра маски прав доступа каталога можно использовать функцию 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 прерывания INT 21h:

На входе: 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 или код ошибки.

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);
}
[Назад] [Содеожание] [Дальше]