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

Пограмма LOG


В этом разделе мы приведем исходный текст программы, выполняющей подключение пользователя к файл-серверу. Возможности этой программы ограничены по сравнению со стандартной утилитой login.exe: она, например, не выполняет интерпретацию файлов Login Script и System Login Script. После подключения к файл-серверу диск "S:" рабочей станции отображается на том SYS:. Вы можете использовать нашу программу как прототип собственной процедуры подключения к файл-серверу.

После проверки присутствия сетевой оболочки программа LOG с помощью функции GetConnectionNumber() получает номер канала текущего файл-сервера и затем, вызвав функцию GetFileServerName(), определяет имя текущего файл-сервера. Имя и номер канала текущего сервера выводятся в стандартный поток вывода.

Далее программа запрашивает имя сервера, имя пользователя и его пароль, при помощи функции AttachToFileServer() создает канал с указанным файл-сервером. Если канал уже есть или его удалось создать, новый сервер делается предпочтительным, для чего вызывается функция SetPreferredConnectionID().

Затем вызывается функция LoginToFileServer(). Она пытается подключить пользователя к предпочтительному серверу.

После подключения программа с помощью функции CheckConsolePrivileges() проверяет, имеет ли данный пользователь права оператора консоли, и выводит соответствующее сообщение.

Для того чтобы получить информацию о сервере, к которому только что подключился пользователь, программа LOG вызывает функцию GetFileServerDescriptionStrings(), которая записывает в четыре буфера имя фирмы-изготовителя, изменения и дату изменений, права на сетевую операционную систему. Содержимое всех этих буферов выводится в стандартный поток вывода.

Затем вызывается функция GetServerInformation(). С ее помощью определяется максимальное количество пользователей для данного сервера.

Так как мы только что подключились к файл-серверу, он должен стать первичным, поэтому на следующем шаге программа LOG вызывает функцию SetPrimaryConnectionID() и делает новый сервер первичным.


Подключившись к файл-серверу, вы еще не имеете доступа к его томам. Для того чтобы вы могли работать с дисками файл-сервера, вам необходимо отобразить один или несколько локальных дисков на сетевые каталоги. В нашей программе мы отображаем диск "S:" на корневой каталог тома SYS: нового первичного сервера. Для этого мы вызываем функцию AllocPermanentDirectoryHandle(). Эту функцию, а также все, что связано с дисками сервера, мы рассмотрим в следующей главе.

// =================================================== // Листинг 6. Подключение к серверу // Файл log\log.c // // (C) A. Frolov, 1993 // ===================================================

#include <stdlib.h> #include <stdio.h> #include <string.h> #include "nit.h" // include-файлы из библиоткеи #include "niterror.h" // NetWare C Interface

// Эта функция не описана в include-файлах // библиотеки NetWare C Interface, поэтому опишем ее сами.



void GetServerInformation(int, FILE_SERV_INFO*);

void main(void) {

int ccode; char ServerName[48]; char UserName[48]; char Password[128]; WORD ConnID, ConnNumber;

char companyName[80], revision[80]; char revisionDate[24], copyrightNotice[80];

FILE_SERV_INFO serverInfo; BYTE newDirectoryHandle, effectiveRightsMask; char driveLetter;

char MajorVersion=0; char MinorVersion=0; char Revision=0;

printf("NetWare Login, (C) Фролов А.В., 1993\n");

asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision); asm pop si

if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; }

// Получаем номер канала, используемого сервером // по умолчанию (default) для связи с рабочей станцией, на // которой была запущена эта программа

ConnNumber = GetConnectionNumber();

// Получаем имя файл-сервера, используемого по умолчанию (default)

GetFileServerName(0, ServerName);

// Выводим имя и номер канала для // сервера, используемого по умолчанию

if(ConnNumber) printf("Сервер по умолчанию '%s', ConnNumber=%04.4X\n", ServerName, ConnNumber);



// Вводим имя сервера, имя пользователя и пароль. // Преобразуем все введенные буквы в заглавные.

printf("\nВведите имя сервера: "); gets(ServerName); strupr(ServerName);

printf("\nВведите ваше имя: "); gets(UserName); strupr(UserName);

printf("\nВведите пароль: "); gets(Password); strupr(Password);

// Создаем канал с сервером

ccode = AttachToFileServer(ServerName, &ConnID);

// Если канал удалось создать или он уже был создан раньше, // выводим имя сервера и номер канала, используемого // на рабочей станции для идентификации сервера.

if(ccode == 0 ccode == ALREADY_ATTACHED_TO_SERVER) { printf("\nServerName='%s', ServerID=%04.4X", ServerName, ConnID);

// Делаем данный сервер предпочтительным для того, // чтобы все запросы направлялись к нему в первую очередь SetPreferredConnectionID(ConnID);

// Подключаем пользователя к файл-серверу

ccode = LoginToFileServer(UserName,OT_USER,Password); if(!ccode) {

// Если подключение произошло успешно, проверяем, есть ли // у подключившегося пользователя права оператора консоли

if(!CheckConsolePrivileges()) printf("Вы оператор консоли\n");

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

GetFileServerDescriptionStrings(companyName, revision, revisionDate, copyrightNotice);

printf("Описание сервера:\n%s\n%s\n\n%s\n%s\n", companyName,revision, revisionDate, copyrightNotice);

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

GetServerInformation(sizeof(serverInfo), &serverInfo); printf("Версия на %d пользователей\n", serverInfo.maxConnectionsSupported);

// Делаем данный сервер первичным.

SetPrimaryConnectionID(ConnID);

// Отображаем диск S: рабочей станции на // корневой каталог тома SYS: сервера

driveLetter = 'S';

ccode = AllocPermanentDirectoryHandle(0,"SYS:\\", driveLetter, &newDirectoryHandle,&effectiveRightsMask); printf("Диск отображен, код CCode = %d\n",ccode); } } else { printf("Ошибка при подключении: %04.4X\n",ccode); return; } }


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