Примечание
Приведенные ниже программы являются упрощенными вариантами программ, представленных на Web-сайте книги. В полных вариантах программ используются отдельные массивы AllowedAceMasks и DeniedAceMasks, в то время как в листингах ниже задействован только один массив.
Использование отдельного массива DeniedAceMasks обеспечивает невозможность запрета прав доступа SYNCHRONIZE, поскольку флаг SYNCHRONIZE устанавливается во всех трех макросах FILE_GENERIC_READ, FILE_GENERIC_WRITE и FILE_GENERIC_EXECUTE, которые являются комбинациями нескольких флагов (см. заголовочный файл WINNT.H). Дополнительные разъяснения предоставляются в полном варианте программы, доступном на Web-сайте. Кроме того, в полном варианте программы проверяется, не указано ли в командной строке групповое имя; ниже мы будем везде предполагать, что указывается имя пользователя.
/* Глава 15. Команда chmodW. */
/* chmodW [опции] режим файл [ИмяГруппы].
Изменение режима доступа к именованному файлу.
Опции:
-f Принудительный режим — не выводить предупреждающие сообщения в случае невозможности изменения режима.
–с Создать файл, если он не существует. Необязательное имя группы указывается после имени файла. */
/* Требуются NTFS и Windows NT (под управлением Windows 9x программа работать не будет). */
#include "EvryThng.h"
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hFile, hSecHeap;
BOOL Force, CreateNew, Change, Exists;
DWORD Mode, DecMode, UsrCnt = ACCT_NAME_SIZE;
TCHAR UsrNam[ACCT_NAME_SIZE];
int FileIndex, GrpIndex, ModeIndex;
/* Массив прав доступа к файлу, следующих в том порядке, который принят в UNIX. */
/* Эти права будут различными для объектов различного типа. */
/*ПРИМЕЧАНИЕ: в полном варианте программы, находящемся на Web-сайте, */
/*используются отдельные массивы масок разрешения и запрещения доступа.*/
DWORD AceMasks[] = {
FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE
};
LPSECURITY_ATTRIBUTES pSa = NULL;
ModeIndex = Options(argc, argv, _T("fc"), &Force, &CreateNew, NULL);
GrpIndex = ModeIndex + 2;
FileIndex = ModeIndex + 1;
DecMode = _ttoi(argv[ModeIndex]);
/* Режим защиты представляет собой восьмеричное число. */
Mode = ((DecMode / 100) % 10) * 64 /*Преобразовать в десятичное число.*/
+ ((DecMode / 10) % 10) * 8 + (DecMode % 10);
Exists = (_taccess(argv[FileIndex], 0) == 0);
if (!Exists && CreateNew) {
/* Файл не существует; создать новый файл. */
GetUserName(UsrNam, &UsrCnt);
pSa = InitializeUnixSA(Mode, UsrNam, argv[GrpIndex], AceMasks, &hSecHeap);