-
Описание:В 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 . Вопрос:В чем я допустил ошибку?
-
> В чем я допустил ошибку?
в непроверке результатов всех вызовов функций
-
Результат какой функции я не проверил? LookupAccountName? Здесь меня вполне устраивает, что если группа не нашлась, то значит и текущий пользователь не является членом данной группы.
-
Уточню. 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;
-
вот этой фразы не понимаю:
DomainName: array [0 .. MAX_PATH] of Char; ... DomainNameSize := Length(DomainName);
Length от мусора ? Может быть SizeOf ?
ну и заодно AccountType возвращенного SID-а проверить на то, что действительно SID группы
-
> вот этой фразы не понимаю: > > DomainName: array [0 .. MAX_PATH] of Char; > ... > DomainNameSize := Length(DomainName); > > Length от мусора ? Может быть SizeOf ? >
Length возвращает количество элементов в массиве. В этом конкретном случае DomainNameSize принимает значение 261 в десятичной системе.
> ну и заодно AccountType возвращенного SID-а проверить на > то, что действительно SID группы
Сейчас буду разбираться с вышесказанными умными словами. :) Спасибо. :)
-
> Length возвращает количество элементов в массиве. В этом > конкретном случае DomainNameSize принимает значение 261 > в десятичной системе.
воистину. думал, раз array of char, оно его будет к string приводить и брать length от получившегося string
-
Удалено модератором Примечание: Дубль
-
> воистину. думал, раз array of char, оно его будет к string > приводить и брать length от получившегося string
Воистину. Думал тоже самое, пока не попробовал. :)
> > ну и заодно AccountType возвращенного SID-а проверить > на > > то, что действительно SID группы > > > Сейчас буду разбираться с вышесказанными умными словами. > :) > Спасибо. :)
Игорь, помоги, плиз, дай наводку. Что-то не могу разобраться. :(
-
Ну, информация "до кучи", опять же. В группы, которые были созданы уже давно сисадмином, я, судя по результатам сабжевой функции, вхожу. А вот вновь созданная группа с таким "сюрпризом".
-
Владислав © (27.01.10 21:59) [8]
А ты покажи, что у тебя возвращает LookupAccountName
-
До вызова LookupAccountNamelpSystemName = 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
-
Мдя... вопрос, как бы, снят... но, как бы, не совсем...
Сейчас все заработало с группой, которую создавал вчера. Для "проверки" создал новую группу, добавил в нее свою учетку. С этой новой группой "не работает" так же, как и вчера со вчерашней группой. Пошел дальше. Из "вчерашней" группы удалил свою учетку. Сабжевая функция "говорит", что я до сих пор вхожу во "вчерашнюю" группу. Такие пироги...
Такое поведение совсем не устраивает, да и понимание причины не добавилось, поэтому буду рад услышать комментарии.
Может пригодится: Рабочая станция Windows XP SP3; Контроллер домена Windows Server 2003 R2.
-
Перезагрузка рабочей станции ситуацию в лучшую сторону не меняет. :(
-
> Такое поведение совсем не устраивает, да и понимание причины > не добавилось, поэтому буду рад услышать комментарии.
кэширование. что-то там в AD надо перезагрузить, не помню щас уже
-
> кэширование. > что-то там в AD надо перезагрузить, не помню щас уже
Странно... Права при добавлении в группу на рабочих станциях появляются мгновенно, а данная функция эти изменения не показывает. Кто/что кэширует?
-
-
-
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';
Перечисляешь, ищешь нужную.
|