2010-01-19 125 views
2

假设我有以下LDAP查询:LDAP查询与FILTER

Base DN: OU=Groups,DC=office,DC=domain,DC=org 
Filter: (member:1.2.840.113556.1.4.1941:=CN=adam smith,OU=Users,DC=office,DC=domain,DC=org) 

我如何执行它德尔福(2007年)下?使用ADO的例子似乎有SQL'ish语法,我现在不怎么转换它?

回答

4

在Delphi中,你可以使用你的数据获取的方式有两种:

  • 无论是 “SQL'ish” 语法,你形容 - 基本ADO访问Active Directory。如果你有SQL背景,这很容易,但在某些方面也受到限制(例如,你无法获得多值属性等)。您会在Richard Mueller的网站上找到一些Search Tips on ADO(AD编程MVP)

  • 导入ActiveDs.tlb类型库并使用ADSI提供的COM接口(最值得注意的是IDirectorySearch)进行搜索。这是一个相当混乱的COM接口,这可能就是最倾向于使用ADO搜索东西,这是更容易平易近人

遥想当年我还在编写德尔福,我做了很多的活动目录的东西,并提出了一些我的Delphi/AD提示和一些示例代码onto my site。这不是在很长一段时间被更新,虽然:-(但ADSISearch组件可能是你的兴趣(和其他Delphites)

更新:你可以试试这个“SQL十岁上下的”语句在TADOCommand?

SELECT sAMAccountName, displayName 
FROM 'LDAP://OU=Groups,DC=office,DC=domain,DC=org' 
WHERE objectCategory='group' 
    AND member:1.2.840.113556.1.4.1941:=(CN=adam smith,OU=Users,DC=office,DC=domain,DC=org) 
+0

谢谢您的repy我真的需要只运行一个查询(我上面贴的那个)如果有人能够重新写。以便我可以使用它TADOCommand ...? – marian12 2010-01-20 08:21:11

+0

是的,但1.2.840.113556.1.4.1941(LDAP_MATCHING_RULE_IN_CHAIN)给了我所有用户所属的组(不仅来自memberof) - 当组是其他grous的成员时发生 - 我需要它们ALL。 – marian12 2010-01-20 08:41:01

0

Desicion您的问题!

var ADOConnection, ADOCmd, Res: Variant; 

ADOConnection := CreateOleObject('ADODB.Connection'); 
ADOCmd := CreateOleObject('ADODB.Command'); 
try 
    ADOConnection.Provider := 'ADsDSOObject'; 
    ADOConnection.Open('Active Directory Provider'); 
    ADOCmd.ActiveConnection := ADOConnection; 
    ADOCmd.Properties('Page Size')  := 100; 
    ADOCmd.Properties('Timeout')  := 30; 
    ADOCmd.Properties('Cache Results') := False; 

    sBase  := '<GC://' + sADForestName+ '>'; 
    sFilter  := '(&(objectCategory=person)(objectClass=user)' + 
        '(distinguishedName=' + sADUserName + ')' + 
        '(memberOf:1.2.840.113556.1.4.1941:=' + sADGroupName + '))'; 
    sAttributes := 'sAMAccountName'; 

    ADOCmd.CommandText := sBase + ';' + sFilter + ';' + sAttributes + ';subtree'; 
    Res := AdoCmd.Execute; 

    if Res.EOF then User := '' 
      else User := Res.Fields[0].Value; 
finally 
    ADOCmd := NULL; 
    ADOConnection.Close; 
    ADOConnection := NULL; 
end;