Выставлени разрешительных ACL поверх запретительных

Тема в разделе "WASM.WIN32", создана пользователем dev, 17 мар 2009.

  1. dev

    dev New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    39
    Здравствуйте!
    Собственно проблема. Нужно добавить на файл запретительные ACL группе "Все", а группе "Администраторы" разрешить полный доступ. Так как запретительные ACL имеют более высокий приоритет нежели разрешительные, то получается, что группе "Администраторы" запрещены действия, выставленные для группы "Все". Подскажите плз механизм какой-нибудь или куда копать...
    Спасибо.
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    АФАИК почти все действия. "Take ownership" вроде бы остается всегда
     
  3. dev

    dev New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    39
    Если я правильно понял, то ты предлагаешь сделать владельцем файла одного из группы "Администраторы"? А как же быть с остальными администраторами? Или я что-то не так понял?
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Убеждённость. Только тут тонкость: "SeTakeOwnershipPrivilege", которая по умолчанию есть у администраторов — это просто привилегия, позволяющая овладевать объектом, не обращая внимания на его ACL.

    Один, вероятно, знает, что если не добавлять разрешительные ACL "Всем", то и в запретительных не будет необходимости? Если так, то можешь либо подробнее описать ситуацию, либо использовать тот факт, что ACE (Access Control Entry) на самом деле проверяются по порядку. Просто высокоуровневые функции приводят список ACE к каноническому виду [ACEs c явным запретом - ACEs с явным разрешением - ACEs с унаследованным запретом - ACEs с унаследованным разрешением]. Тем не менее, один может создать свой ACL, где первым будет стоять ACE, дающий Администраторам полный доступ. Смотри "ACE structure" в msdn, далее по ссылкам.
     
  5. dev

    dev New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    39
    Ситуация действительно не позволяет так делать...
    Смотрел и не раз...

    Вообщем проблему решил функциями AddAccessAllowedAce, AddAccessDeniedAce.
    Кому интересно:
    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3. #include <stdio.h>
    4. #include <aclapi.h>
    5. #include <tchar.h>
    6.  
    7. #define NUM_OF_ACES 2
    8.  
    9. int _tmain(int argc, _TCHAR* argv[])
    10. {
    11.   SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
    12.   SID_IDENTIFIER_AUTHORITY SIDAuthNT     = SECURITY_NT_AUTHORITY;
    13.   PSECURITY_DESCRIPTOR      pSD              = NULL;
    14.   PACL                                pAcl              = NULL;
    15.   DWORD                             cbAcl            = 0x00;
    16.   PSID                                pEveryoneSID = NULL;
    17.   PSID                                pAdminSID      = NULL;
    18.   DWORD                            dwRes            = 0x00;
    19.  
    20.   if( !AllocateAndInitializeSid( &SIDAuthWorld,
    21.                                  0x01,
    22.                                  SECURITY_WORLD_RID,
    23.                                  0x00,
    24.                                  0x00,
    25.                                  0x00,
    26.                                  0x00,
    27.                                  0x00,
    28.                                  0x00,
    29.                                  0x00,
    30.                                  &pEveryoneSID ) )
    31.   {
    32.     //CleanUp
    33.   }
    34.  
    35.   if( !AllocateAndInitializeSid( &SIDAuthNT,
    36.                                         2,
    37.                                         SECURITY_BUILTIN_DOMAIN_RID,
    38.                                         DOMAIN_ALIAS_RID_ADMINS,
    39.                                         0x00,
    40.                                         0x00,
    41.                                         0x00,
    42.                                         0x00,
    43.                                         0x00,
    44.                                         0x00,
    45.                                         &pAdminSID ) )
    46.   {
    47.     //CleanUp
    48.   }
    49.  
    50.   cbAcl = sizeof(ACL) + ((sizeof(ACCESS_DENIED_ACE) - sizeof(DWORD)) * NUM_OF_ACES);
    51.    
    52.   cbAcl += GetLengthSid( pEveryoneSID );
    53.   cbAcl += GetLengthSid( pAdminSID );
    54.    
    55.   pAcl = (ACL*)LocalAlloc(LPTR, cbAcl);
    56.   if (pAcl)
    57.   {
    58.     if (InitializeAcl(pAcl, cbAcl, ACL_REVISION))
    59.     {
    60.       dwRes = AddAccessAllowedAce( pAcl, ACL_REVISION, GENERIC_ALL, pAdminSID );
    61.       dwRes = AddAccessDeniedAce( pAcl, ACL_REVISION, GENERIC_WRITE, pEveryoneSID );
    62.  
    63.       pSD = ( PSECURITY_DESCRIPTOR )LocalAlloc( LPTR, sizeof( SECURITY_DESCRIPTOR ) );
    64.        
    65.       if ( !InitializeSecurityDescriptor( pSD,
    66.                                                  SECURITY_DESCRIPTOR_REVISION ) )
    67.       {  
    68.           //CleanUp
    69.       }
    70.  
    71.       if ( !SetSecurityDescriptorDacl( pSD,
    72.                                                 TRUE,
    73.                                                 pAcl,
    74.                                                 FALSE ) )
    75.       {  
    76.           //CleanUp
    77.       }
    78.      
    79.       SetFileSecurity( pszFileName,
    80.                             DACL_SECURITY_INFORMATION,
    81.                             pSD );
    82.       return 0x01;            
    83.     }
    84.   }
    85.  
    86.   return 0x00;
    87. }