Пограмма 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; } }