Системное программирование в среде Windows
Шрифт:
Программа 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 для исключений при распределении памяти. */
*рНеар = SAHeap;
pSA = HeapAlloc(SAHeap, 0, sizeof (SECURITY_ATTRIBUTES));
pSA->nLength = sizeof(SECURITY_ATTRIBUTES);
pSA->bInheritHandle = FALSE;
/* Программист может выполнить эти установки позже. */
pSD = HeapAlloc(SAHeap, 0, sizeof(SECURITY_DESCRIPTOR));
pSA->lpSecurityDescriptor = pSD;
InitializeSecurityDescriptor(pSD, SECURITY DESCRIPTOR REVISION);
/* Получить SID пользователя, группы и прочих пользователей.
* Другие важные подробности можно найти на Web-сайте. */
pGrpNms[0] = UsrNam;
pGrpNms[1] = GrpNam;
for (iSid = 0; iSid < 3; iSid++) {
pSidTable[iSid] = HeapAlloc(SAHeap, 0, SID_SIZE);
LookupAccountName(NULL, pGrpNms[iSid], pSidTable[iSid], &SidCnt[iSid], RefDomain[iSid], &RefDomCnt[iSid], &sNamUse[iSid]);
}
SetSecurityDescriptorOwner(pSD, pSidTable[0], FALSE);
SetSecurityDescriptorGroup(pSD, pSidTable[1], FALSE);
pAcl = HeapAlloc(ProcHeap, HEAP_GENERATE_EXCEPTIONS, ACL_SIZE);
InitializeAcl(pAcl, ACL_SIZE, ACL_REVISION);
/* Добавить все элементы АСЕ, разрешающие и запрещающие доступ. */
for (iBit = 0; iBit < 9; iBit++) {
if ((UnixPerms >> (8 – iBit) & 0x1) != 0 && AceMasks[iBit%3] != 0) AddAccessAllowedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
else if (AceMasks[iBit%3] != 0) AddAccessDeniedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
}
/* Добавить запрет доступа для всех АСЕ категории "Прочие". */
Success = Success && AddAccessDeniedAce(pAcl, ACL_REVISION, STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL, pSidTable[2]);
/* Связать ACL с атрибутом защиты. */
SetSecurityDescriptorDacl(pSD, TRUE, pAcl, FALSE);
Поделиться с друзьями: