2010-01-19 98 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;