Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];

Вниз

Входит ли пользователь в группу 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1356121802
Юрий
2012-12-22 00:30
2013.04.21
С днем рождения ! 22 декабря 2012 суббота


15-1356202525
wl
2012-12-22 22:55
2013.04.21
Опять фильмы


15-1356325818
Андреевич
2012-12-24 09:10
2013.04.21
sql-запрос


8-1231501163
Б
2009-01-09 14:39
2013.04.21
Обрезка растра


3-1288772165
Lexer
2010-11-03 11:16
2013.04.21
SELECT * FROM TABLE T WHERE (T.id = :param) OR (:param = -1)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский