使用 ActiveX 資料物件搜尋 (ADO)

ActiveX Data Object (ADO) 模型是由下表所列的物件所組成。

Object 描述
[連接] OLE DB 數據源的開啟連線,例如 ADSI。
命令 定義要針對數據源執行的特定命令。
參數 要提供給命令物件之任何參數的選擇性集合。
記錄 數據表、命令物件或 SQL 語法中的一組記錄。 您可以建立記錄集,而不需要任何基礎連接物件。
欄位 記錄集中的單一數據行。
屬性 由 ADO 提供者提供的值集合。
錯誤 包含資料存取錯誤的相關資料。 在單一作業中發生錯誤時重新整理。

若要讓 ADO 與 ADSI 通訊,至少必須有兩個 ADO 物件:連線 ionRecordSet。 這些 ADO 物件分別用來驗證使用者和列舉結果。 一般而言,您也會使用 Command 對象來維護作用中的連線、指定查詢參數,例如頁面大小和搜尋範圍,以及執行查詢。 如需搜尋篩選語法的詳細資訊,請參閱 搜尋篩選語法

連線 ion 物件會載入 OLE DB 提供者,並驗證用戶認證。 在 Visual Basic 中,使用 “ADODB.連線 呼叫 CreateObject 函式ion“ 建立 連線 ion 物件的實例,然後將 連線 ion 物件的 Provider 屬性設定為 ”ADsDSOObject“。 “ADODB。連線 ion“ 是 連線 ion 物件的 ProgID,而 ”ADsDSOObject“ 是 ADSI 中 OLE DB 提供者的名稱。 如果未指定任何認證,則會使用目前登入用戶的認證。

下列程式代碼範例示範如何建立 連線 ion 對象的實例

Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"

下列程式代碼範例示範如何建立 連線 ion 對象的實例

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>

下列程式代碼範例示範如何建立 連線 ion 對象的實例。 請注意,您必須將 ADO 類型連結庫 (msadoXX.dll) 包含在 Visual Basic 專案中的其中一個參考。

Dim Con As New Connection
con.Provider = "ADsDSOObject"

藉由設定 連線 ion 物件的屬性來指定使用者驗證數據。 下表列出 ADSI 支援的使用者驗證屬性。

屬性 說明
“使用者標識符” 字串,識別執行搜尋時使用其安全性內容的使用者。 如需使用者名稱字串格式的詳細資訊,請參閱 IADsOpenDSObject::OpenDSObject 如果未指定,則預設值為已登入的使用者,或由呼叫程式仿真的使用者。
"Password" 字串,指定 「使用者識別碼」所識別之用戶的密碼。
「加密密碼」 布爾值,指定密碼是否加密。 預設值為 false
“ADSI 旗標” 指定系結驗證選項之ADS_AUTHENTICATION_ENUM列舉中的一組旗標。 預設值為 0。

下列程式代碼範例示範如何在建立 Command 物件之前設定屬性。

Set oConnect = CreateObject("ADODB.Connection")
oConnect.Provider = "ADsDSOObject"
oConnect.Properties("User ID") = stUser
oConnect.Properties("Password") = stPass
oConnect.Properties("Encrypt Password") = True
oConnect.Open "DS Query", stUser, stPass

第二個 ADO 對像是 Command 物件。 Command 物件的 ProgID 是 “ADODB。命令」。 這個物件可讓您使用使用中連接向 ADSI 發出查詢語句和其他命令。 Command 物件會使用其 Active 連線 ion 屬性來維護作用中的連線。 它也會維護 CommandText 屬性,以保存使用者發出的查詢語句。 查詢語句會以 SQL 方言LDAP 方言表示。

下列程式代碼範例示範如何建立 Command 物件。

Set command = CreateObject("ADODB.Command")
Set command.ActiveConnection = oConnect
command.CommandText = 
"SELECT AdsPath, cn FROM 'LDAP://DC=Fabrikam,DC=com' WHERE objectClass = '*'"

在下列程式代碼範例中,包含 ADO 類型連結庫 (msadoXX.dll) 作為其中一個參考。

Dim command As New Command
Set command.ActiveConnection = oConnect
command.CommandText = "<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath, cn; subTree"

Command 物件的搜尋選項是藉由設定 Properties 屬性來指定。 下表列出 Properties 可接受的具名屬性。

Named 屬性 描述
“異步” 布爾值,指定搜尋是同步還是異步。 預設值為 False (同步)。 同步搜尋會封鎖,直到伺服器傳回整個結果,或針對分頁搜尋,整個頁面為止。 異步搜尋會封鎖搜尋結果的一個數據列,或直到 “Timeout” 屬性所指定的時間經過為止。
「快取結果」 布爾值,指定是否應該在用戶端快取結果。 默認值為 true;ADSI 會快取結果集。 針對大型結果集,可能會想要關閉這個選項。
“大通推薦” ADS_CHASE_REFERRALS_ENUM的值,指定搜尋如何追逐轉介。 預設值為 ADS_CHASE_REFERRALS_NEVER。如需此屬性的詳細資訊,請參閱 轉介
「僅限數據行名稱」 布爾值,指出搜尋應該只擷取已指派值的屬性名稱。 預設值為 false
“Deref Aliases” 布爾值,指定是否解析找到對象的別名。 預設值為 false
「頁面大小」 開啟分頁的整數值,並指定要在結果集中傳回的物件數目上限。 預設值為沒有頁面大小。 如需詳細資訊,請參閱 擷取大型結果集
“SearchScope” 指定 搜尋範圍的ADS_SCOPEENUM 列舉值。 預設值為 ADS_SCOPE_SUBTREE
「大小限制」 指定搜尋大小限制的整數值。 針對 Active Directory,大小限制會指定傳回物件的最大數目。 伺服器會在達到大小限制時停止搜尋,並傳回累積的結果。 預設值沒有限制。
「排序開啟」 字串,指定要做為排序索引鍵的屬性逗號分隔清單。 此屬性僅適用於支援伺服器端排序LDAP控制件的目錄伺服器。 Active Directory 支援排序控件,但可能會影響伺服器效能,特別是當結果集很大時。 請注意,Active Directory 僅支援單一排序索引鍵。 預設值為無排序。
“時間限制” 整數值,指定搜尋的時間限制,以秒為單位。 達到時間限制時,伺服器會停止搜尋並傳回累積的結果。 預設值沒有時間限制。
“Timeout” 指定用戶端逾時值的整數值,以秒為單位。 這個值表示用戶端在停止搜尋之前等候伺服器結果的時間。 預設值為沒有逾時。

下列程式代碼範例示範如何設定搜尋選項。

Const ADS_SCOPE_ONELEVEL = 1
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40

Dim Com As New Command
 
Com.Properties("Page Size") = 999
Com.Properties("Timeout") = 30     ' Seconds
Com.Properties("searchscope") = ADS_SCOPE_ONELEVEL
Com.Properties("Chase referrals") = ADS_CHASE_REFERRALS_EXTERNAL
Com.Properties("Cache Results") = False     ' Do not cache the result set.

第三個 ADO 對像是 RecordSet。 當您在 Command 物件上用 Execute 方法時,就會取得這個物件。 RecordSet 物件的主要函式是列舉結果集並取得數據。 結果集可以包含同時具有單一或多個值之屬性的值。 取得單一值屬性很簡單,類似於取得關係資料庫中的數據行值,例如:

Fields('name').Value

不過,取得具有多個值的屬性更具挑戰性。 在此情況下, Field.Value 是陣列,您必須檢查陣列的下限和上限,如下列程式代碼範例所示。

Set rs = Com.Execute
 
For i = 0 To rs.Fields.Count - 1
    Debug.Print rs.Fields(i).Name, rs.Fields(i).Type
Next i
 
'--------------------------
' Navigate the record set.
'--------------------------
rs.MoveFirst
lstResult.Clear      ' Clear the user interface.
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
    ' For Multi Value attribute
    If rs.Fields(i).Type = adVariant And Not (IsNull(rs.Fields(i).Value)) Then
        Debug.Print rs.Fields(i).Name, " = "
        For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
            Debug.Print rs.Fields(i).Value(j), " # "
            lstResult.AddItem rs.Fields(i).Value(j)
        Next j
    Else
        ' For Single Value attribute.
         Debug.Print rs.Fields(i).Name, " = ", rs.Fields(i).Value
         lstResult.AddItem rs.Fields(i).Value
    End If
Next i
rs.MoveNext
Wend

下列程式代碼範例會停用LDAP伺服器上的用戶帳戶。

Dim X as IADs
Dim con As New Connection, rs As New Recordset
Dim MyUser As IADsUser
 
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider", "CN=Test,CN=Users,DC=Fabrikam,DC=COM,O=INTERNET", "Password"
Set rs = con.Execute("<LDAP://MyMachine/DC=MyDomain,DC=Fabrikam,DC=com>;(objectClass=User);ADsPath;onelevel")
 
While Not rs.EOF
    ' Bind to the object to make changes 
    ' to it because ADO is currently read-only.
    MyUser = GetObject(rs.Fields(0).Value)
    MyUser.AccountDisabled = True
    MyUser.SetInfo
    rs.MoveNext
Wend

如需 ADO 物件模型的詳細資訊,請參閱 Microsoft ActiveX Data Objects