Здравствуйте! Собственно проблема. Нужно добавить на файл запретительные ACL группе "Все", а группе "Администраторы" разрешить полный доступ. Так как запретительные ACL имеют более высокий приоритет нежели разрешительные, то получается, что группе "Администраторы" запрещены действия, выставленные для группы "Все". Подскажите плз механизм какой-нибудь или куда копать... Спасибо.
Если я правильно понял, то ты предлагаешь сделать владельцем файла одного из группы "Администраторы"? А как же быть с остальными администраторами? Или я что-то не так понял?
Убеждённость. Только тут тонкость: "SeTakeOwnershipPrivilege", которая по умолчанию есть у администраторов — это просто привилегия, позволяющая овладевать объектом, не обращая внимания на его ACL. Один, вероятно, знает, что если не добавлять разрешительные ACL "Всем", то и в запретительных не будет необходимости? Если так, то можешь либо подробнее описать ситуацию, либо использовать тот факт, что ACE (Access Control Entry) на самом деле проверяются по порядку. Просто высокоуровневые функции приводят список ACE к каноническому виду [ACEs c явным запретом - ACEs с явным разрешением - ACEs с унаследованным запретом - ACEs с унаследованным разрешением]. Тем не менее, один может создать свой ACL, где первым будет стоять ACE, дающий Администраторам полный доступ. Смотри "ACE structure" в msdn, далее по ссылкам.
Ситуация действительно не позволяет так делать... Смотрел и не раз... Вообщем проблему решил функциями AddAccessAllowedAce, AddAccessDeniedAce. Кому интересно: Код (Text): #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <aclapi.h> #include <tchar.h> #define NUM_OF_ACES 2 int _tmain(int argc, _TCHAR* argv[]) { SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY; PSECURITY_DESCRIPTOR pSD = NULL; PACL pAcl = NULL; DWORD cbAcl = 0x00; PSID pEveryoneSID = NULL; PSID pAdminSID = NULL; DWORD dwRes = 0x00; if( !AllocateAndInitializeSid( &SIDAuthWorld, 0x01, SECURITY_WORLD_RID, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &pEveryoneSID ) ) { //CleanUp } if( !AllocateAndInitializeSid( &SIDAuthNT, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &pAdminSID ) ) { //CleanUp } cbAcl = sizeof(ACL) + ((sizeof(ACCESS_DENIED_ACE) - sizeof(DWORD)) * NUM_OF_ACES); cbAcl += GetLengthSid( pEveryoneSID ); cbAcl += GetLengthSid( pAdminSID ); pAcl = (ACL*)LocalAlloc(LPTR, cbAcl); if (pAcl) { if (InitializeAcl(pAcl, cbAcl, ACL_REVISION)) { dwRes = AddAccessAllowedAce( pAcl, ACL_REVISION, GENERIC_ALL, pAdminSID ); dwRes = AddAccessDeniedAce( pAcl, ACL_REVISION, GENERIC_WRITE, pEveryoneSID ); pSD = ( PSECURITY_DESCRIPTOR )LocalAlloc( LPTR, sizeof( SECURITY_DESCRIPTOR ) ); if ( !InitializeSecurityDescriptor( pSD, SECURITY_DESCRIPTOR_REVISION ) ) { //CleanUp } if ( !SetSecurityDescriptorDacl( pSD, TRUE, pAcl, FALSE ) ) { //CleanUp } SetFileSecurity( pszFileName, DACL_SECURITY_INFORMATION, pSD ); return 0x01; } } return 0x00; }