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

WORD TotalBlocks, SectorsPerBlock, AvailableBlocks; WORD



Листинг 7

Программа для просмотра имен // томов текущего или первичного файл-сервера // Файл volinfo\volinfo.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h>
#include <stdio.h>
#define WORD unsigned int #define BYTE unsigned char extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int GetVolumeName(int, char*);
extern "C" int GetVolumeInfoWithNumber(BYTE, char*, WORD*, WORD*, WORD*, WORD*, WORD*, WORD*);
void main(void) { char MajorVersion=0; char MinorVersion=0; char Revision=0; char VolumeName[64][16]; int ccode, i; WORD TotalBlocks, SectorsPerBlock, AvailableBlocks; WORD TotalDirectorySlots, AvailableDirectorySlots, Removable; long TotalSectors, AvailableSectors; printf("\n*VOLINFO* (C) Frolov A., 1993\n");
asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision);
asm pop si if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n");
return; } printf("\nСмонтированные тома:\n" "----------------------------------------------\n");
printf("Имя тома\tВсего Кбайт\tСвободно Кбайт\n");
printf("----------------------------------------------");
// Цикл по томам файл-сервера. for(i=0; i<64; i++) {

// Получаем и выводим имя тома ccode = GetVolumeName(i, VolumeName[i]);
printf("\n%s\t", VolumeName[i]);
// Если ошибка или тома нет, выходим из цикла if(ccode) break; if(!*(VolumeName[i])) break; // Получаем информацию о томе ccode = GetVolumeInfoWithNumber(i, VolumeName[i], &TotalBlocks, &SectorsPerBlock, &AvailableBlocks, &TotalDirectorySlots,&AvailableDirectorySlots, &Removable);
if(!ccode) { // Подсчитываем общее количество секторов на томе // и количество свободных секторов TotalSectors = (long)TotalBlocks * SectorsPerBlock; AvailableSectors = (long)AvailableBlocks * SectorsPerBlock; // Выводим размер томов и размер свободного пространства // в килобайтах. Учитываем, что размер сектора // составляет 512 байт. printf("\t%ld\t\t%ld", ((long)TotalSectors * 512L) / 1024L, ((long)AvailableSectors * 512L) / 1024L);
} } } Вот что программа VOLINFO вывела на экран, когда мы запустили ее на нашем сервере SYSPRG: *VOLINFO* (C) Frolov A., 1993 Смонтированные тома: ---------------------------------------------- Имя тома Всего Кбайт Свободно Кбайт ---------------------------------------------- SYS 140000 8084 VOL1 178864 13768 VOL2 160000 13372 VOL3 169024 924



Листинг 8

Отображение содержимого таблиц сетевой оболочки. // Файл wkstable\wkstable.cpp // // (C) A. Frolov, 1993 // ============================================================ #include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define BYTE unsigned char // Формат таблицы номеров каналов для сетевой оболочки struct ConnectionIDTable { BYTE InUseFlag; BYTE OrderNumber; BYTE NetworkNumber[4]; BYTE NodeAddress[6]; BYTE SocketNumber[2]; BYTE ReceiveTimeout[2]; BYTE RoutingNode[6]; BYTE PacketSequenceNumber; BYTE ConnectionNumber; BYTE ConnectionStatus; BYTE MaximumTimeout[2]; BYTE Reserved[5]; }; void GetTableAddress(int Table, char far * *TableAddress);
void ShowTable(char far *DriveHandleTable);
void ShowConnIDTable(struct ConnectionIDTable far *ConnIDTable);
void ShowServerNameTable(char far *ServerNameTable);
void main(void) { // Указатели на таблицы сетевой оболочки char far *DriveHandleTable; char far *DriveFlagTable; char far *DriveServerTable; char far *ServerMappingTable; char far *ServerNameTable; struct ConnectionIDTable far *ConnIDTable; // Получаем указатели на таблицы GetTableAddress(0, &DriveHandleTable);
GetTableAddress(1, &DriveFlagTable);
GetTableAddress(2, &DriveServerTable);
GetTableAddress(3, &ServerMappingTable);
GetTableAddress(4, &ServerNameTable);
printf("\nТаблицы сетевой оболочки, (C) Frolov A., 1993\n" "---------------------------------------------\n");
// Отображаем содержимое таблицы индексов дисковых устройств printf("\nDrive Handle Table (%Fp)\n", DriveHandleTable);
printf( "------------------\n");
ShowTable(DriveHandleTable);
// Отображаем содержимое таблицы флагов дисковых устройств printf("\nDrive Flag Table (%Fp)\n", DriveFlagTable);
printf( "----------------\n");
ShowTable(DriveFlagTable);
// Отображаем содержимое таблицы отображения дисков на серверы printf("\nDrive Server Table (%Fp)\n", DriveServerTable);
printf( "------------------\n");
ShowTable(DriveServerTable);
printf("Нажмите любую клавишу для продолжения...\n");
getch();
// Отображаем содержимое таблицы каналов с серверами ConnIDTable = (struct ConnectionIDTable far *)ServerMappingTable; printf("\nConnection ID Table (%Fp)\n", ConnIDTable);
printf( "-------------------\n");
ShowConnIDTable(ConnIDTable);
// Отображаем содержимое таблицы имен серверов printf("\nServer Name Table (%Fp)\n", ServerNameTable);
printf( "-----------------\n");
ShowServerNameTable(ServerNameTable);
} // =========================================================== // Функция для отображения таблицы имен серверов // =========================================================== void ShowServerNameTable(char far *ServerNameTable) { for(int i=0; i<8; i++) { if(*(ServerNameTable + 48*i) != '\0') printf("%d: %Fs\n", i+1, ServerNameTable + 48*i);
else printf("%d: Не используется\n", i+1);
} } // =========================================================== // Функция для отображения таблицы каналов рабочей станции // =========================================================== void ShowConnIDTable(struct ConnectionIDTable far *ConnIDTable) { printf("Порядковый номер:\t");
for(int i=0; i<8; i++) { printf("%d ", i+1);
} printf("\nНомер канала:\t\t");
for(i=0; i<8; i++) { printf("%02.2X ", (ConnIDTable + i)->
ConnectionNumber);
} printf("\nСостояние канала:\t");
for(i=0; i<8; i++) { printf("%02.2X ", (ConnIDTable + i)->
ConnectionStatus);
} printf("\n");
} // =========================================================== // Функция для вывода содержимого таблиц отображения // дисковых устройств // =========================================================== void ShowTable(char far *Table) { printf("A B C D E F G H I J K L M N " "O P Q R S T U V W X Y Z\n");
for(int i=0; i<26; i++) { printf("%02.2X ",(unsigned char)*(Table +i));
} printf("\n[ \\ ] ^ _ '\n");
for(i=26; i<32; i++) { printf("%02.2X ",(unsigned char)*(Table +i));
} printf("\n");
} // =========================================================== // Функция для получения указателей на таблицы // оболочки рабочей станции // =========================================================== void GetTableAddress(int Table, char far* *TableAddress) { union REGS regs; struct SREGS sregs; regs.h.ah = 0xef; regs.h.al = Table; intdosx(&regs, &regs, &sregs);
FP_OFF(*TableAddress) = regs.x.si; FP_SEG(*TableAddress) = sregs.es; } Мы запустили программу в сети, содержащей четыре файл-сервера, и вот что увидели на экране: Таблицы сетевой оболочки, (C) Frolov A., 1993 --------------------------------------------- Drive Handle Table (C143:01A0) ------------------ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 02 02 02 00 06 03 04 05 [ \ ] ^ _ ' 00 00 00 00 00 00 Drive Flag Table (C143:01C0) ---------------- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 80 80 80 80 80 80 80 80 80 01 00 00 00 00 00 00 00 00 01 01 01 00 01 01 01 01 [ \ ] ^ _ ' 00 00 00 00 00 00 Drive Server Table (C143:01E0) ------------------ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 04 03 02 00 01 01 01 01 [ \ ] ^ _ ' 00 00 00 00 00 00 Нажмите любую клавишу для продолжения... Connection ID Table (C143:0254) ------------------- Порядковый номер: 1 2 3 4 5 6 7 8 Номер канала: 04 0B 01 01 FF FF FF FF Состояние канала: FF FF FF FF 00 00 00 00 Server Name Table (C143:0354) ----------------- 1: SYSPRG 2: SMARTNET 3: NETLAB 4: WINLAB 5: Не используется 6: Не используется 7: Не используется 8: Не используется
Из таблицы Server Name Table видно, что рабочая станция создала каналы с серверами SYSPRG, SMARTNET, NETLAB и WINLAB.
Анализируя содержимое таблицы Drive Flag Table, можно сделать вывод, что рабочая станция имеет локальные диски от A: до I:, диски J:, S:, T:, U:, W:, X:, Y:, Z: постоянно отображены на сетевые каталоги, т. е. это сетевые диски.
Из таблицы Drive Server Table видно, что диски J:, W:, X:, Y:, Z: отображены на каталоги сервера SYSPRG (номер канала соответствует позиции имени файл-сервера в таблице имен). Диск U: отображен на сервер SMARTNET (канал 2), диск T: - на сервер NETLAB (канал 3), диск S: - на сервер WINLAB (канал 4).
Таблица Drive Handle Table позволяет сетевой оболочке определить, на какие конкретно каталоги отображены соответствующие диски, так как она содержит индекс таблицы отображения соответствующего файл-сервера.
Из таблицы Connection ID Table можно получить информацию о том, какие из 8 имеющихся каналов задействованы и какие номера каналов используют серверы для работы с нашей станцией. Например, сервер SYSPRG использует канал с номером 04h, сервер SMARTNET - канал с номером 0Bh, а серверы NETLAB и WINLAB - каналы с номером 01h. Пусть вас не смущает, что последние два сервера используют один и тот же номер канала: эти номера соответствуют таблице, расположенной в сервере, а не в рабочей станции.

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








Листинг 9

Отображение локальных дисков на // сетевые каталоги // Файл dirmap\dirmap.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 AllocPermanentDirectoryHandle(BYTE, char *, char, BYTE*, BYTE*);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; BYTE NewDirectoryHandle; BYTE RightsMask; int ccode; printf("\n*DIRMAP* (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 < 3) { printf("Укажите локальный диск и путь " "к каталогу, \nнапример: dirmap f sys:users\n");
return; } // Параметры должны быть заданы заглавными буквами strupr(argv[1]);
strupr(argv[2]);
// Создаем новый индекс каталога и отображаем диск ccode = AllocPermanentDirectoryHandle(0, argv[2], argv[1][0], &NewDirectoryHandle, &RightsMask);
// Если ошибок не было, выводим индекс каталога // и маску прав для каталога if(!ccode) printf("Индекс каталога: %d, маска прав: %02.2X\n", NewDirectoryHandle, RightsMask);
else printf("Ошибка %02.2X\n", ccode);
}

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








Листинг 10

Отмена отображения локального диска на // сетевой каталог // Файл dirunmap\dirunmap.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" BYTE GetDirectoryHandle(BYTE);
extern "C" int DeallocateDirectoryHandle(BYTE);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; BYTE DirectoryHandle; int ccode; printf("\n*DIRUNMAP* (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( "Укажите локальный диск, например: dirunmap f\n");
return; } // Параметр должен быть задан заглавной буквой strupr(argv[1]);
// Получаем индекс каталога, на который отображен указанный диск DirectoryHandle = GetDirectoryHandle(argv[1][0] - 'A');
// Если диск не отображен на сетевой каталог, // выводим сообщение об ошибке if(DirectoryHandle) printf("Индекс каталога: %d\n", DirectoryHandle);
else { printf("Диск не отображен на сетевой каталог\n");
return; } // Отменяем отображение диска ccode = DeallocateDirectoryHandle(DirectoryHandle);
// Если ошибок не было, выводим индекс каталога // и маску прав для каталога if(ccode) printf("Ошибка %02.2X\n", ccode);
else printf("Диск %c удален\n", argv[1][0]);
}

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








Листинг 11

Просмотр списка подкаталогов // сетевого каталога // Файл dirscan\dirscan.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 ScanDirectoryInformation(BYTE, char *, int *, char *, BYTE *, long *, BYTE *);
extern "C" int GetBinderyObjectName(long, char *, WORD *);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; int SequenceNumber; char DirectoryName[16]; BYTE CreationDataAndTime[4]; long OwnerObjectID; BYTE RightsMask; int ccode; char ObjectName[48]; WORD ObjectType; printf("\n*DIRSCAN* (C) Frolov A., 1993\n");
// Проверяем наличие сетевой оболочки asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision);
asm pop si if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n");
return; } // В качестве аргумента необходимо задать // путь к просматриваемому каталогу в виде SYS:USERS\* if(argc < 2) { printf("Укажите путь к каталогу, " "например: dirscan sys:users\\*\n");
return; } printf("Содержимое каталога %s\n", argv[1]);
printf("--------------------------------------------\n");
printf("Имя \tКто владелец каталога\n");
printf("--------------------------------------------\n");
// Путь должен быть задан заглавными буквами strupr(argv[1]);
// Цикл просмотра каталога for(SequenceNumber = 0;;) { // Получаем информацию о содержимом каталога ccode = ScanDirectoryInformation(0, argv[1], &SequenceNumber, DirectoryName, CreationDataAndTime, &OwnerObjectID, &RightsMask);
// Если были ошибки или каталог пуст, завершаем цикл if(ccode) break; if(DirectoryName[0] == '\0') break; // Выводим имя каталога printf("%-12s", DirectoryName);
// Если для каталога определен владелец, // получаем и выводим имя владельца if(OwnerObjectID) { GetBinderyObjectName(OwnerObjectID, ObjectName, &ObjectType);
printf("\t%-12s \n", ObjectName);
} else printf("\t <Нет сведений о владельце>
\n");
} }

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








Листинг 12

Создание каталога // Файл makedir\makedir.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 CreateDirectory(BYTE, char*, BYTE);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; BYTE RightsMask; int ccode; printf("\n*MAKEDIR* (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 < 3) { printf("Укажите имя создаваемого каталога и " "права доступа, \nнапример: makedir sys:users RW");
return; } // Параметры должны быть заданы заглавными буквами strupr(argv[1]);
strupr(argv[2]);
// Определяем маску прав, разбирая второй // параметр, заданный при запуске программы RightsMask = 0x00; for(int i = 0; argv[2][i] != '\0' ; i++) { switch(argv[2][i]) { case 'R': RightsMask |= 1; break; case 'W': RightsMask |= 2; break; case 'O': RightsMask |= 4; break; case 'C': RightsMask |= 8; break; case 'D': RightsMask |= 0x10; break; case 'P': RightsMask |= 0x20; break; case 'S': RightsMask |= 0x40; break; case 'M': RightsMask |= 0x80; break; case '-': break; default: printf("Ошибка в параметрах\n");
return; } } // Создаем каталог ccode = CreateDirectory(0, argv[1], RightsMask);
if(!ccode) printf("Каталог создан\n");
else printf("Ошибка %02.2X\n", ccode);
} Программа RENMDIR (листинг 13) позволяет переименовать существующий сетевой каталог. Путь к каталогу и его новое имя следует задать в качестве параметров при запуске программы. // ===================================================

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








Листинг 13

Переименование каталога // Файл renmdir\renmdir.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 RenameDirectory(BYTE, char *, char *);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; int ccode; printf("\n*RENMDIR* (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 < 3) { printf("Укажите путь к каталогу и " "новое имя, \nнапример: renmdir sys:users usr");
return; } // Параметры должны быть заданы заглавными буквами strupr(argv[1]);
strupr(argv[2]);
// Переименовываем каталог ccode = RenameDirectory(0, argv[1], argv[2]);
if(!ccode) printf("Каталог переименован\n");
else printf("Ошибка %02.2X\n", ccode);
} Программа DELDIR (листинг 14) удаляет каталог, путь к которому задан в качестве параметра при запуске программы. // ===================================================

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








Листинг 14

Удаление каталога // Файл deldir\deldir.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 DeleteDirectory(BYTE, char *);
void main(int argc, char *argv[]) { char MajorVersion=0; char MinorVersion=0; char Revision=0; int ccode; printf("\n*DELDIR* (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например: deldir sys:users");
return; } // Параметр должен быть задан заглавными буквами strupr(argv[1]);
// Удаляем каталог ccode = DeleteDirectory(0, argv[1]);
if(!ccode) printf("Каталог удален\n");
else printf("Ошибка %02.2X\n", ccode);
}

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








Листинг 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);
}

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








Листинг 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);
}

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






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