Получить группы пользователей из Active Directory с ПК, который НЕ является частью домена
Мне нужно получить список групп, в которые входит специальный пользователь. Обычно я могу сделать это с помощью NetUserGetGroups, вот код:
function GetLDapUserGroups(UserName, DomainName : string) : TStringList;
var bufptr : Pointer;
ServerName : String;
EntriesRead : DWord;
TotalEntries : DWord;
buf : Pbyte;
PGlobalGroupInfo : PGroupInfo0;
i : integer;
begin
result:=TStringList.Create;
// get servername
// if problems occur maybe set param2 to nil
bufptr := nil;
NetGetAnyDCName(nil, PWideChar(DomainName), bufptr);
ServerName := PWideChar(bufptr);
Delete(ServerName, 1, 2); // remove starting '\\' from server Name
if NetUserGetGroups( PWideChar(ServerName), PWideChar(UserName), 0, buf, MAX_PREFERRED_LENGTH,
@EntriesRead, @TotalEntries)=NERR_SUCCESS then
begin
PGlobalGroupInfo := PGroupInfo0(buf);
// Store group names in list
for i:=0 to EntriesRead - 1 do
begin
result.Add(PGlobalGroupInfo^.grpi0_name);
inc(PGlobalGroupInfo);
end;
end;
NetAPIBufferFree(buf);
end;
но это не работает, если моя программа работает на ПК, который не является частью домена AD. Очевидно, что это возможно, я пытался использовать LDAP Administrator (от Softerra), и там это работает.
Я старался:
- JclWin32.NetUserGetGroups - Нет. (Я могу понять, что это не работает, я не могу передать пароль пользователя здесь. Работает нормально с ПК, который находится в домене)
- JwaLmAccess.NetUserGetLocalGroups - Нет. Также нет возможности передать пароль
- NetApi.GetNetUserGroups - та же история здесь
- CreateOleObject('ADODB.Command')... - Нет
Мне только что удалось проверить пароль с компьютера, не являющегося доменом (см. Проверка имени пользователя / пароля в Active Directory с компьютера, который НЕ является частью домена), поэтому я попытался выполнить команды при входе в систему, но это также не удалось.
Оглядываясь в источниках джедаев, я наткнулся на функцию "JwaWinLDAP.ldap_search_sW". Для меня это пахнет многообещающе, так как я могу передать токен LDap от входа в систему. Однако я не нашел примеров кода о том, как искать группы пользователей. Я должен продолжать смотреть на эту функцию?
Кто-нибудь может подтолкнуть меня в правильном направлении, пожалуйста?:) Спасибо!
1 ответ
Прежде чем вы сможете запросить AD, вы должны сначала войти в систему с пользователем, который имеет права на доступ к этой AD.
Использование токена, основанного на локальном входе пользователя, почти наверняка не даст вам доступа к запросам AD.