2017-02-07 8 views
1

Я хотел бы создать группу SID для группы администраторов домена и передать ее CheckTokenMembership, чтобы определить, принадлежит ли данный пользователь AD группе. Тем не менее, я не совсем уверен в том, какие полномочия идентификатора и сублицензии следует использовать с AllocateAndInitializeSid. Все «рабочие» примеры, которые я видел до сих пор, касаются только местных групп.Как использовать AllocateAndInitializeSid для группы AD?

Пример:

SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY; 
PSID adminGroup; 

AllocateAndInitializeSid(&ntAuthority, 
         2, 
         SECURITY_BUILTIN_DOMAIN_RID, 
         DOMAIN_ALIAS_RID_ADMINS, 
         0, 0, 0, 0, 0, 0, 
         &adminGroup); 

Что суб-органы должны быть использованы для создания SID для группы AD Администраторов власти и? Я пробовал DOMAIN_GROUP_RID_ADMINS и DOMAIN_USER_RID_ADMIN с SECURITY_NT_AUTHORITY, но CheckTokenMembership всегда сообщал, что данный пользователь не был членом группы, которая была неправильной.

Любые примеры и указатели на он-лайн документы были бы оценены.

+0

но какой токен вы используете для проверки? admin в uac? у него есть 'S-1-5-32-544' (sid, который вы используете) с атрибутом' SE_GROUP_USE_FOR_DENY_ONLY' – RbMm

+0

Я использую токен, полученный от LogonUser. Пример: LogonUser (имя_пользователя, домен, пароль, LOGON32_LOGON_NETWORK, LOGON32_PRIVIDER_DEFAULT, & hToken) – bdristan

+0

, но пользователь не поднят Я думаю? в этом случае 'S-1-5-32-544' (sid, который вы используете) с атрибутом' SE_GROUP_USE_FOR_DENY_ONLY' в токене. и CheckTokenMembership и должны вернуть false – RbMm

ответ

1

Вы можете использовать LsaQueryInformationPolicy() с PolicyDnsDomainInformation для извлечения SID для основного домена компьютера.

Кроме того, если вы знаете, что учетная запись, которую вы запрашиваете, принадлежит к тому же домену, что и группа администраторов доменов, которую вы заинтересовали, вы можете использовать GetWindowsAccountDomainSid() для извлечения SID домена из SID учетной записи.

После того, как вы получили SID домена, вы можете использовать CreateWellKnownSid(), чтобы создать группу SID для группы «Администраторы домена». Используйте опцию WinAccountDomainAdminsSid. Тогда это просто вопрос вызова CheckTokenMembership(), как вы уже сказали.

+1

У меня нет проблем с получением определенного SID домена. Как я могу использовать его, чтобы определить, принадлежит ли данный домен пользователю группы домена? – bdristan

+0

Я добавил это к своему ответу. –

+0

CreateWellKnownSid()/CheckTokenMembership() работает для меня, поэтому я принимаю этот ответ. Предложение RbMm также работает, но этот подход работает лучше для меня, потому что я поддерживаю SID домена. – bdristan

0

Вы можете перечислить группы токенов и проверить, являются интересными для вас SID настоящее время.

volatile UCHAR guz; 

ULONG IsDomainAdmin(HANDLE hToken, PBOOL IsMember) 
{ 
    ULONG cb = 0, rcb = 0x100, err; 
    PVOID stack = alloca(guz); 

    union { 
     PVOID buf; 
     PTOKEN_GROUPS ptg; 
    }; 

    do 
    { 
     if (cb < rcb) 
     { 
      cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack); 
     } 

     if (GetTokenInformation(hToken, TokenGroups, buf, cb, &rcb)) 
     { 
      *IsMember = FALSE; 

      if (ULONG GroupCount = ptg->GroupCount) 
      { 
       PSID_AND_ATTRIBUTES Groups = ptg->Groups; 
       do 
       { 
        // S-1-5-21-domain-512 
        PSID Sid = Groups++->Sid; 
        PSID_IDENTIFIER_AUTHORITY psia = GetSidIdentifierAuthority(Sid); 

        static SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY; 

        if (!memcmp(psia, &ntAuthority, sizeof(SID_IDENTIFIER_AUTHORITY))) 
        { 
         ULONG n = *GetSidSubAuthorityCount(Sid); 

         if (
          1 < n && 
          *GetSidSubAuthority(Sid, 0) == SECURITY_NT_NON_UNIQUE && 
          *GetSidSubAuthority(Sid, n - 1) == DOMAIN_GROUP_RID_ADMINS 
          ) 
         { 
          *IsMember = TRUE; 

          return NOERROR; 
         } 
        } 

       } while (--GroupCount); 
      } 
      return NOERROR; 
     } 

    } while ((err = GetLastError()) == ERROR_INSUFFICIENT_BUFFER); 

    return err; 
} 
+0

Этот код является неправильным в большинстве случаев, и следует использовать CheckTokenMembership. Очень редко рассматривать идентификатор SID только для отказа в качестве «действительной» записи группы. – Anders

+0

@ Аnders - легко можно добавить здесь проверить атрибуты SID (существуют 'SE_GROUP_ENABLED' существуют и' SE_GROUP_USE_FOR_DENY_ONLY' не существует), но я не уверен, как нужно интерпретировать этот случай - мы хотим проверить * доступ * или * членство *? и «неправильно в большинстве случаев» - что вы подразумеваете под этим? что 'DOMAIN_GROUP_RID_ADMINS' не включен в токен в большинстве случаев? вы не путаете его с 'DOMAIN_ALIAS_RID_ADMINS'? – RbMm

+0

Для большинства случаев я больше всего беспокоюсь о том, что люди находят этот код и используют его, не понимая, что есть атрибут deny. Линии между доступом и членством могут быть немного размытыми, и если бит отказа установлен, кто его установил и почему?Преднамеренно ограничивать себя или политику компании? Есть еще больше соображений безопасности. Я не уверен, сможет ли локальный администратор создать токен с идентификатором SID для группы, членом которой они не являются. Предполагается, что функции win32 помешают вам это сделать, но я не уверен в API Nt * или в драйвере ядра. – Anders

Смежные вопросы