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

       

Объекты, коды объектов и права доступа


База данных Bindery хранит объекты, которые имеют такие атрибуты, как идентификатор, имя, тип, флаг (статический или динамический объект), байт доступа.

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

Имя объекта представляет собой текстовую строку размером не более 47 байт. В операциях поиска объектов в базе данных по имени в поле имени допускается указывать символы "*" и "?", которые интерпретируются обычным способом, как и в MS-DOS.

Библиотека NetWare C Interface имеет функции, позволяющие просматривать список всех объектов базы данных, искать объекты определенного типа или по имени с использованием шаблона и символов "*" и "?". По идентификатору объекта вы можете легко получить его имя и наоборот, по имени можно узнать идентификатор объекта.

Тип объекта определяет сетевой ресурс и может принимать следующие значения:



Значение Описание
0 Неклассифицируемый (неизвестный) объект
1 Пользователь
2 Группа пользователей
3 Очередь печати
4 Файл-сервер
5 Сервер заданий
6 Шлюз
7 Сервер печати
8 Очередь для архивирования
9 Сервер для архивирования
A Очередь заданий
B Администратор
24 Сервер удаленного моста

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

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


Байт доступа используется для определения прав, необходимых для поиска, чтения, создания, редактирования или удаления объекта. Две тетрады байта отвечают за доступ на чтение и доступ на запись. Младшие четыре бита байта доступа отвечают за чтение, старшие - за запись.

Для тетрад определены значения от 0 до 4 - уровни доступа. Для того чтобы пользователь или другой объект получили доступ, тетрады его собственного байта доступа должны иметь значения, равные или превышающие значения в байте доступа объекта, к которому запрашивается доступ.

Приведем список возможных значений для уровней доступа:

0 Anyone Объект не подключен к файл-серверу
1 Logged Объект подключен к файл-серверу
2 Object Объект подключен к файл-серверу с именем и паролем
3 Supervisor Объект имеет права супервизора
4 NetWare Объект имеет права операционной системы Novell NetWare
Для определения собственного уровня доступа и идентификатора пользователя программа может воспользоваться функцией GetBinderyAccessLevel():

int GetBinderyAccessLevel(BYTE *SecurityAccessLevel, long *ObjectID);

Первый параметр этой функции указывает на слово, в которое будет записан уровень доступа, второй - на двойное слово, в которое будет записан идентификатор пользователя.

Вместо функции GetBinderyAccessLevel() можно использовать функцию E3h прерывания INT21h:

На входе: AH = E3h;
DS:SI = Адрес буфера запроса;
ES:DI = Адрес буфера ответа.
На выходе: AL = Код ошибки или 0, если операция завершилась без ошибок.
Буфер запроса имеет следующий формат:

struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 70 };

Буфер ответа имеет следующий формат:

struct REPLAY { WORD PacketLength; // размер пакета BYTE SecurityAccessLevel; // уровень доступа long ObjectID; // идентификатор объекта };

По идентификатору объекта вы можете получить его имя и тип с помощью функции GetBinderyObjectName():

int GetBinderyObjectName(long ObjectID, char *ObjectName, WORD *ObjectType);



Для объекта, идентификатор которого задан первым параметром, функция возвращает имя объекта и его тип, записывая их в области памяти, указанные при помощи второго и третьего параметров.

Функция возвращает 0 при успешном завершении или код ошибки:

Код ошибки Значение
0x96 Мало памяти на сервере
0xFC В базе нет объекта с указанным идентификатором
0xFE База данных Bindery заблокирована
0xFF Сбой базы данных Bindery
Вместо функции GetBinderyObjectName() вы также можете использовать функцию E3h прерывания INT 21h. При этом необходимо использовать форматы буфера запроса и буфера ответа, приведенные ниже.

Буфер запроса:

struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 54 long ObjectID; // идентификатор объекта };

Буфер ответа:

struct REPLAY { WORD PacketLength; // размер пакета long ObjectID; // идентификатор объекта WORD ObjectType; // тип объекта BYTE ObjectName[48]; // имя объекта };

Для получения идентификатора объекта по его имени и типу вы можете воспользоваться функцией GetBinderyObjectID():

int GetBinderyObjectID(char *ObjectName,WORD ObjectType, long *ObjectID);

Имя и тип объекта задаются первым и вторым параметрами, идентификатор записывается по адресу, заданному третьим параметром.

Функция возвращает 0 при успешном завершении или код ошибки:

Код ошибки Значение
0x96 Мало памяти на сервере
0xEF Имя объекта указано неправильно
0xF0 Не допускаются символы шаблона "*", "?"
0xFC В базе нет объекта с указанным идентификатором
0xFE База данных Bindery заблокирована
0xFF Сбой базы данных Bindery
Вместо функции GetBinderyObjectID() можно использовать функцию E3h прерывания INT 21h. Приведем форматы буфера запроса и буфера ответа.

Буфер запроса:

struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 53 long ObjectType; // тип объекта BYTE ObjectNameLength; // длина имени объекта BYTE ObjectName[ObjectNameLength]; // имя объекта };

Буфер ответа:

struct REPLAY { WORD PacketLength; // размер пакета long ObjectID; // идентификатор объекта WORD ObjectType; // тип объекта BYTE ObjectName[48]; // имя объекта };


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