![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как улучшить поиск в LDAP? Есть такая конструкция, которая
EgorovAlex © (2006-03-22 10:58:00)сначала возвращает путь пользователя, а потом по этому пути получает самого пользователя:
Connection := CreateOleObject('ADODB.Connection');
Command := CreateOleObject('ADODB.Command');
try
Connection.Provider := 'ADsDSOObject';
Connection.Open('Active Directory Provider');
Command.ActiveConnection := Connection;
Command.Properties('Page Size') := 1000;
Command.Properties('Searchscope') := ADS_SCOPE_SUBTREE;
Command.CommandText := 'SELECT distinguishedName FROM ''LDAP://' + UserDomain + ''' WHERE objectCategory=''group'' AND sAMAccountName=''' + GrpName + '''';
try
Res := Command.Execute;
if not Res.EOF then
AdsPath := Res.Fields[0].Value;
except
end;
Res := NULL;
finally
Command := NULL;
Connection.Close;
Connection := NULL;
end;
ADsGetObject(PWideChar('LDAP://' + AdsPath), IADsGroup, Group);
Так вот вопрос: как мне сразу после поиска в Res получить группу, а не путь для неё? Т.к. в данном случае делается лишний вызов ADsGetObject.
На vbs скрипте видел, что такое возможно.
EgorovAlex (2006-03-22 15:20:00) [1]Ещё нашёл описание для интерфейса IADsNameTranslate - для получения LDAP пути. Но не могу на делфи это переделать:
' Determine DNS domain name from RootDSE object.
Set objRootDSE = G("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
' Use the NameTranslate object to find the NetBIS domain name from the
' DNS domain name.
Set objTrans = C("NameTranslate")
objTrans.Init 3, strDNSDomain
objTrans.Set 1, strDNSDomain
strNetBISDomain = objTrans.Get(3)
' Remove trailing backslash.
strNetBISDomain = Left(strNetBISDomain, Len(strNetBISDomain) - 1)
' Use the NameTranslate object to convert the NT user name to the
' Distinguished Name required for the LDAP provider.
objTrans.Init 1, strNetBISDomain
objTrans.Set 3, strNetBISDomain & "\" & strNTName
strUserDN = objTrans.Get(1)
' Bind to the user object in Active Directory with the LDAP provider.
Set objUser = G("LDAP://" & strUserDN)
EgorovAlex (2006-03-22 13:02:00) [2]Нет, мне не пользователи нужны, а нужно мне интерфейс группы из домена получить по её имени. Я не знаю как запрос построить и как потом результат в Group: IADsGroup загнать.
Alex Konshin (2006-03-22 11:56:00) [3]Занятно... А я и не знал, что оно и SQL синтаксис поддерживает.
Насколько я понял тебе нужно выбрать объекты, у которых objectClass=person и memberOf=<DN_нужной_группы>. Сам думай, как оно в твоем случае будет выглядеть.
Сходи любым LDAP броузером на свой домен контролер, все становится понятно.
Единственная хитрость - узнать свой собственный DN чтобы приконнектится. Например, у меня дома CN=Alex Konshin,CN=Users,DC=home
Для меня откровением было, что в первом токене нужно не логин указывать, а полное имя.