Объекты, коды объектов и права доступа
База данных 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]; // имя объекта };