Конференция "WinAPI" » Входит ли пользователь в группу AD. [WinXP]
 
  • Владислав © (27.01.10 14:43) [0]
    Описание:
    В Active Directory создаю группу aradmin. Добавляю свою учетку AD в группу.
    Логинюсь под своей учеткой на рабочей станции.
    Вызываю следующую функцию:

    function GetIsMemberOf(const AGroupName: string): Boolean;
    var
     IsMember: BOOL;
     AccountType: SID_NAME_USE;
     DomainNameSize: DWORD;
     DomainName: array [0 .. MAX_PATH] of Char;
     SidToCheck: PSID;
     SidToCheckSize: DWORD;
     ProcessHandle: THandle;
     TokenHandle: THandle;
    begin
     SidToCheckSize := 1024;
     DomainNameSize := Length(DomainName);
     ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
       GetCurrentProcessId());
     if ProcessHandle = 0 then
       RaiseLastOSError;
     try
       if not OpenProcessToken(ProcessHandle, TOKEN_READ, TokenHandle) then
         RaiseLastOSError;
       try
         GetMem(SidToCheck, SidToCheckSize);
         try
           Result := LookupAccountName(nil, PChar(AGroupName), SidToCheck,
             SidToCheckSize, DomainName, DomainNameSize, AccountType);
           if Result then
           begin
             if not CheckTokenMembership(0, SidToCheck, IsMember) then
               RaiseLastOSError;
             Result := IsMember;
           end;
         finally
           FreeMem(SidToCheck);
         end;
       finally
         CloseHandle(TokenHandle);
       end;
     finally
       CloseHandle(ProcessHandle);
     end;
    end;



    GetIsMemberOf(‘aradmin’)

    возвращает
    False

    .

    Вопрос:
    В чем я допустил ошибку?
  • Игорь Шевченко © (27.01.10 14:45) [1]

    > В чем я допустил ошибку?


    в непроверке результатов всех вызовов функций
  • Владислав © (27.01.10 14:54) [2]
    Результат какой функции я не проверил? LookupAccountName? Здесь меня вполне устраивает, что если группа не нашлась, то значит и текущий пользователь не является членом данной группы.
  • Владислав © (27.01.10 14:57) [3]
    Уточню.

    function GetIsMemberOf(const AGroupName: string): Boolean;
    var
    IsMember: BOOL;
    AccountType: SID_NAME_USE;
    DomainNameSize: DWORD;
    DomainName: array [0 .. MAX_PATH] of Char;
    SidToCheck: PSID;
    SidToCheckSize: DWORD;
    ProcessHandle: THandle;
    TokenHandle: THandle;
    begin
    SidToCheckSize := 1024;
    DomainNameSize := Length(DomainName);
    ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
      GetCurrentProcessId());
    if ProcessHandle = 0 then
      RaiseLastOSError;
    try
      if not OpenProcessToken(ProcessHandle, TOKEN_READ, TokenHandle) then
        RaiseLastOSError;
      try
        GetMem(SidToCheck, SidToCheckSize);
        try
          Result := LookupAccountName(nil, PChar(AGroupName), SidToCheck,
            SidToCheckSize, DomainName, DomainNameSize, AccountType);
          if Result then
          begin
            if not CheckTokenMembership(0, SidToCheck, IsMember) then
              RaiseLastOSError;
            Result := IsMember; // <= Вот до сюда доходим. Т.е. группа нашлась, но IsMember == FALSE
          end;
        finally
          FreeMem(SidToCheck);
        end;
      finally
        CloseHandle(TokenHandle);
      end;
    finally
      CloseHandle(ProcessHandle);
    end;
    end;

  • Игорь Шевченко © (27.01.10 15:22) [4]
    вот этой фразы не понимаю:

    DomainName: array [0 .. MAX_PATH] of Char;
    ...
    DomainNameSize := Length(DomainName);

    Length от мусора ? Может быть SizeOf ?

    ну и заодно AccountType возвращенного SID-а проверить на то, что действительно SID группы
  • Владислав © (27.01.10 15:35) [5]

    > вот этой фразы не понимаю:
    >
    > DomainName: array [0 .. MAX_PATH] of Char;
    > ...
    > DomainNameSize := Length(DomainName);
    >
    > Length от мусора ? Может быть SizeOf ?
    >


    Length возвращает количество элементов в массиве. В этом конкретном случае DomainNameSize принимает значение 261 в десятичной системе.


    > ну и заодно AccountType возвращенного SID-а проверить на
    > то, что действительно SID группы


    Сейчас буду разбираться с вышесказанными умными словами. :)
    Спасибо. :)
  • Игорь Шевченко © (27.01.10 16:24) [6]

    > Length возвращает количество элементов в массиве. В этом
    > конкретном случае DomainNameSize принимает значение 261
    > в десятичной системе.


    воистину. думал, раз array of char, оно его будет к string приводить и брать length от получившегося string
  • Игорь Шевченко © (27.01.10 16:24) [7]
    Удалено модератором
    Примечание: Дубль
  • Владислав © (27.01.10 21:59) [8]

    > воистину. думал, раз array of char, оно его будет к string
    > приводить и брать length от получившегося string

    Воистину. Думал тоже самое, пока не попробовал. :)


    > > ну и заодно AccountType возвращенного SID-а проверить
    > на
    > > то, что действительно SID группы
    >
    >
    > Сейчас буду разбираться с вышесказанными умными словами.
    >  :)
    > Спасибо. :)


    Игорь, помоги, плиз, дай наводку. Что-то не могу разобраться. :(
  • Владислав © (27.01.10 22:09) [9]
    Ну, информация "до кучи", опять же.
    В группы, которые были созданы уже давно сисадмином, я, судя по результатам сабжевой функции, вхожу. А вот вновь созданная группа с таким "сюрпризом".
  • Игорь Шевченко © (27.01.10 22:37) [10]
    Владислав ©   (27.01.10 21:59) [8]

    А ты покажи, что у тебя возвращает LookupAccountName
  • Владислав © (28.01.10 08:24) [11]
    До вызова LookupAccountName
    lpSystemName = nil
    lpAccountName = 'R\aradmin'
    Sid не инициализирован
    cbSid = 1024
    ReferencedDomainName не инициализированный массив
    cchReferencedDomainName = 261
    peUse не инициализирован



    После вызова LookupAccountName
    lpSystemName = nil
    lpAccountName = 'R\aradmin'
    Sid указатель
    cbSid = 1024
    ReferencedDomainName = R#0
    cchReferencedDomainName = 261
    peUse = 2
    LookupAccountName возвращает TRUE

  • Владислав © (28.01.10 08:45) [12]
    Мдя... вопрос, как бы, снят... но, как бы, не совсем...

    Сейчас все заработало с группой, которую создавал вчера.
    Для "проверки" создал новую группу, добавил в нее свою учетку. С этой новой группой "не работает" так же, как и вчера со вчерашней группой.
    Пошел дальше. Из "вчерашней" группы удалил свою учетку. Сабжевая функция "говорит", что я до сих пор вхожу во "вчерашнюю" группу. Такие пироги...

    Такое поведение совсем не устраивает, да и понимание причины не добавилось, поэтому буду рад услышать комментарии.

    Может пригодится:
    Рабочая станция Windows XP SP3;
    Контроллер домена Windows Server 2003 R2.
  • Владислав © (28.01.10 08:54) [13]
    Перезагрузка рабочей станции ситуацию в лучшую сторону не меняет. :(
  • clickmaker © (28.01.10 14:02) [14]
    > Такое поведение совсем не устраивает, да и понимание причины
    > не добавилось, поэтому буду рад услышать комментарии.

    кэширование.
    что-то там в AD надо перезагрузить, не помню щас уже
  • Владислав © (28.01.10 14:37) [15]

    > кэширование.
    > что-то там в AD надо перезагрузить, не помню щас уже


    Странно...
    Права при добавлении в группу на рабочих станциях появляются мгновенно, а данная функция эти изменения не показывает. Кто/что кэширует?
  • Игорь Шевченко © (28.01.10 15:03) [16]
  • Владислав © (29.01.10 14:15) [17]
    Спасибо за помощь.


    > Игорь Шевченко ©   (28.01.10 15:03) [16]
    > http://mail.python.org/pipermail/python-win32/2008-August/008019.
    > html
    >
    > ?


    Не нравится такой вариант. :(

    P.S.: Если еще кто-нибудь может что-то сказать, буду рад! :)
  • Дмитрий С © (29.01.10 15:56) [18]
    // Спасибо, clickmaker!

    function NetUserGetGroups(ServerName, UserName : LPWSTR; Level : DWORD;
     Buffer : PUSER_INFO_1; PrefMaxLen : DWORD; EntriesRead,
     TotalEntries : LPDWORD) : LongInt; StdCall; External 'netapi32.dll';

    function NetApiBufferFree(Buffer: Pointer): DWORD;  stdcall;
     external 'netapi32.dll';



    Перечисляешь, ищешь нужную.
 
Конференция "WinAPI" » Входит ли пользователь в группу AD. [WinXP]
Есть новые Нет новых   [134431   +16][b:0][p:0.005]