Форум: "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 не инициализирован
После вызова LookupAccountNamelpSystemName = 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