Системное программирование в среде Windows
Шрифт:
};
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);
hFile = CreateFile(argv[FileIndex], 0, 0, pSa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(hFile);
HeapDestroy(hSecHeap); /* Освободить память, занимаемую структурами безопасности. */
}
else if (Exists) { /* Файл существует; изменить разрешения доступа. */
Change = ChangeFilePermissions(Mode, argv[FileIndex], AceMasks);
}
return 0;
}
В программе 15.2 представлена соответствующая часть команды lsFP, а именно, функция Process Item.
Программа 15.2. lsFP: перечисление разрешений на доступ к файлу
static BOOL ProcessItem(LPWIN32_FIND_DATA pFileData, DWORD NumFlags, LPBOOL Flags)
/* Вывести список атрибутов с указанием разрешений доступа и владельца. */
/* Требуются NTFS и Windows NT (под управлением Windows 9x программа работать не будет). */
{
DWORD FType = FileType(pFileData), Mode, i;
BOOL Long = Flags[1];
TCHAR GrpNam[ACCT_NAME_SIZE], UsrNam[ACCT_NAME_SIZE];
SYSTEMTIME LastWrite;
TCHAR PermString[] = _T("---------");
const TCHAR RWX[] = {'r','w','x'}, FileTypeChar[] = {' ', 'd'};
if (FType != TYPE_FILE && FType != TYPE_DIR) return FALSE;
_tprintf(_T("\n"));
if (Long) {
Mode = ReadFilePermissions(pFileData->cFileName, UsrNam, GrpNam);
if (Mode == 0xFFFFFFFF) Mode = 0;
for (i = 0; i < 9; i++) {
if (Mode >> (8 – i) & 0x1) PermString[i] = RWX[i % 3];
}
_tprintf(_T("%c%s 18.7s %8.7s%10d"), FileTypeChar[FType – 1], PermString, UsrNam, GrpNam, pFileData->nFileSizeLow);
FileTimeToSystemTime(&(pFileData->ftLastWriteTime), &LastWrite);
_tprintf(_T(" %02d/%02d/%04d %02d:%02d:%02d"), LastWrite.wMonth, LastWrite.wDay, LastWrite.wYear, LastWrite.wHour, LastWrite.wMinute, LastWrite.wSecond);
}
_tprintf(_T(" %s"), pFileData->cFileName);
return TRUE;
}
Далее
Пример: инициализация атрибутов защиты
Программа 15.3 представляет вспомогательную функцию InitializeUnixSA. Эта функция создает структуру атрибутов безопасности, которая содержит ACL с элементами АСЕ, эмулирующими разрешения на доступ к файлам в UNIX. Существует девять АСЕ, предоставляющих или запрещающих доступ по чтению, записи или запуску файлов на выполнение владельцу (owner), группе (group) и прочим пользователям (everyone). Эта структура не является локальной переменной функции и должна распределяться и инициализироваться, а затем возвращаться вызывающей программе; обратите внимание на массив AceMasks в программе 15.1.
Программа 15.3. InitUnFp: инициализация атрибутов защиты
/* Задание режима доступа в стиле UNIX посредством элементов АСЕ, хранящихся в структуре SECURITY_ATTRIBUTES. */
#include "EvryThng.h"
#define ACL_SIZE 1024
#define INIT_EXCEPTION 0x3
#define CHANGE_EXCEPTION 0x4
#define SID_SIZE LUSIZE
#define DOM_SIZE LUSIZE
LPSECURITY_ATTRIBUTES InitializeUnixSA(DWORD UnixPerms, LPCTSTR UsrNam, LPCTSTR GrpNam, LPDWORD AceMasks, LPHANDLE pHeap) {
HANDLE SAHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
LPSECURITY_ATTRIBUTES pSA = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pAcl = NULL;
BOOL Success;
DWORD iBit, iSid, UsrCnt = ACCT_NAME_SIZE;
/* Таблицы имен пользователя (User), группы (Group) и прочих пользователей (Everyone), идентификаторов SID и так далее для LookupAccountName и создания SID. */
LPCTSTR pGrpNms[3] = {EMPTY, EMPTY, _T("Everyone")};
PSID pSidTable[3] = {NULL, NULL, NULL};
SID_NAME_USE sNamUse[3] = {SidTypeUser, SidTypeGroup, SidTypeWellKnownGroup};
TCHAR RefDomain[3][DOM_SIZE];
DWORD RefDomCnt[3] = {DOM_SIZE, DOM_SIZE, DOM_SIZE};
DWORD SidCnt[3] = {SID_SIZE, SID_SIZE, SID_SIZE};
__try { /* Блок try-except для исключений при распределении памяти. */
Поделиться:
Популярные книги
Санек
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Отмороженный 6.0
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Я — Легион
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Идеальный мир для Социопата 13
13. Социопат
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
6 Секретов мисс Недотроги
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
Убивать чтобы жить 4
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Вечная Война. Книга V
5. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
7.29
рейтинг книги
Здравствуй, 1984-й
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
На границе империй. Том 7
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
Бездомыш. Предземье
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Газлайтер. Том 1
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Огненный князь
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Генерал-адмирал. Тетралогия
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Месть Паладина
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00