Re[2]: Группа SYSTEM и файл
От: Alex Fedotov США  
Дата: 12.07.01 16:43
Оценка:
Здравствуйте Kiton, вы писали:

K>Возникла такая проблема, при предоставлении прав на файл наследуются

K>некоторые права от родительского объекта, и поэтому кроме SYSTEM появляется
K>ещё куча разрешений. В функцию BuildExplicitAccessWithName передаётся флаг
K>NO_INHERITANCE, но наследование всё равно происходит. Файл создаётся через
K>CreateFile в которую передаётся SECURITY_ATTRIBUTES поле bInheritHandle
K>которой равно FALSE.

Флаг NO_INHERITANCE не имеет к этому никакого отношения. Он говорит, что
та ACE, которая добавляется не должна наследоваться (в данном случае она
не будет наследоваться все равно, поскольку применяется к файлу, а не
каталогу).

Чтобы защитить дескриптор от модификации наследуемыми ACL, нужно установить
в нем флаг SE_DACL_PROTECTED. Этот флаг и соответствующая функция
SetSecurityDescriptorControl существуют только в Win2K, в NT 4 автоматического
наследования ACEs нет.

В общем, должно получиться примерно так (обработка ошибок опущена для
краткости):

SECURITY_DESCRIPTOR SecDesc;
PACL pAcl;
PSID pSidSystem;

SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea;

// create SYSTEM SID
AllocateAndInitializeSid(&sia, 1, SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0, &pSidSystem);

// fill entries for SYSTEM account
ea.grfAccessMode = GRANT_ACCESS;
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea.Trustee.pMultipleTrustee = NULL;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea.Trustee.ptstrName = (LPTSTR)pSidSystem;

// create DACL
SetEntriesInAcl(1, &ea, NULL, &pAcl);
FreeSid(pSidSystem);

// initialize security descriptor
InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION);

#if _WIN32_WINNT >= 0x500
// protects the DACL from being modified by inheritable ACEs
SetSecurityDescriptorControl(&SecDesc, SE_DACL_PROTECTED, SE_DACL_PROTECTED);
#endif

// assign the DACL to the securite descriptor
SetSecurityDescriptorDacl(&SecDesc, TRUE, pAcl, FALSE);

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = &SecDesc;

// create new file with security descriptor assigned
HANDLE hFile = CreateFile(_T("C:\\Projects\\test\\test.dat"), 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, &sa, CREATE_NEW,
0, NULL);

// cleanup
LocalFree((HLOCAL)pAcl);
CloseHandle(hFile);
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.