Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.21;
Скачать: CL | DM;

Вниз

Входит ли пользователь в группу AD.   Найти похожие ветки 

 
Владислав ©   (2010-01-27 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.

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


 
Игорь Шевченко ©   (2010-01-27 14:45) [1]


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


в непроверке результатов всех вызовов функций


 
Владислав ©   (2010-01-27 14:54) [2]

Результат какой функции я не проверил? LookupAccountName? Здесь меня вполне устраивает, что если группа не нашлась, то значит и текущий пользователь не является членом данной группы.


 
Владислав ©   (2010-01-27 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;


 
Игорь Шевченко ©   (2010-01-27 15:22) [4]

вот этой фразы не понимаю:

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

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

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


 
Владислав ©   (2010-01-27 15:35) [5]


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


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


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


Сейчас буду разбираться с вышесказанными умными словами. :)
Спасибо. :)


 
Игорь Шевченко ©   (2010-01-27 16:24) [6]


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


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


 
Игорь Шевченко ©   (2010-01-27 16:24) [7]

Удалено модератором
Примечание: Дубль


 
Владислав ©   (2010-01-27 21:59) [8]


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

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


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


Игорь, помоги, плиз, дай наводку. Что-то не могу разобраться. :(


 
Владислав ©   (2010-01-27 22:09) [9]

Ну, информация "до кучи", опять же.
В группы, которые были созданы уже давно сисадмином, я, судя по результатам сабжевой функции, вхожу. А вот вновь созданная группа с таким "сюрпризом".


 
Игорь Шевченко ©   (2010-01-27 22:37) [10]

Владислав ©   (27.01.10 21:59) [8]

А ты покажи, что у тебя возвращает LookupAccountName


 
Владислав ©   (2010-01-28 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


 
Владислав ©   (2010-01-28 08:45) [12]

Мдя... вопрос, как бы, снят... но, как бы, не совсем...

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

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

Может пригодится:
Рабочая станция Windows XP SP3;
Контроллер домена Windows Server 2003 R2.


 
Владислав ©   (2010-01-28 08:54) [13]

Перезагрузка рабочей станции ситуацию в лучшую сторону не меняет. :(


 
clickmaker ©   (2010-01-28 14:02) [14]

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

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


 
Владислав ©   (2010-01-28 14:37) [15]


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


Странно...
Права при добавлении в группу на рабочих станциях появляются мгновенно, а данная функция эти изменения не показывает. Кто/что кэширует?


 
Игорь Шевченко ©   (2010-01-28 15:03) [16]

http://mail.python.org/pipermail/python-win32/2008-August/008019.html

?


 
Владислав ©   (2010-01-29 14:15) [17]

Спасибо за помощь.


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


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

P.S.: Если еще кто-нибудь может что-то сказать, буду рад! :)


 
Дмитрий С ©   (2010-01-29 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";


Перечисляешь, ищешь нужную.



Страницы: 1 вся ветка

Текущий архив: 2013.04.21;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
2-1350085369
Вова
2012-10-13 03:42
2013.04.21
Утечка памяти DataSet


15-1356292928
Павел Калугин
2012-12-24 00:02
2013.04.21
Опять анкеты?


15-1355289271
Andy BitOff
2012-12-12 09:14
2013.04.21
Ждем 12.12.12 12:12:12.12


15-1356096608
OldProgrammer
2012-12-21 17:30
2013.04.21
О психологической обстановке на форуме


15-1354293250
Rouse_
2012-11-30 20:34
2013.04.21
Ну чтож, добил таки цикл статей про отладку.