使用 ActiveX 資料物件搜尋 (ADO)
ActiveX Data Object (ADO) 模型是由下表所列的物件所組成。
物件 | 描述 |
---|---|
連線 | OLE DB 資料源的開放連線,例如 ADSI。 |
命令 | 定義要針對數據源執行的特定命令。 |
參數 | 可選集合,用於提供給命令物件的任何參數。 |
記錄集 | 數據表、命令物件或 SQL 語法中的一組記錄。 您可以建立記錄集,而不需要任何基礎連接物件。 |
欄位 | 記錄集中的單一數據欄。 |
屬性 | 由 ADO 提供者提供的值集合。 |
錯誤 | 包含資料存取錯誤的相關資料。 在單一作業中發生錯誤時重新整理。 |
若要讓 ADO 與 ADSI 通訊,至少必須有兩個 ADO 物件:Connection 和 RecordSet。 這些 ADO 物件分別用來驗證使用者和列舉結果。 一般而言,您也會使用 Command 對象來維護使用中的連線、指定查詢參數,例如頁面大小和搜尋範圍,以及執行查詢。 如需搜尋篩選語法的詳細資訊,請參閱 搜尋篩選語法。
Connection 物件會載入 OLE DB 提供者,並驗證用戶認證。 在 Visual Basic 中,呼叫 CreateObject 函式並使用 "ADODB.Connection" 來建立 Connection 物件的實例,然後將 Connection 物件的 Provider 屬性設定為 "ADsDSOObject"。 “ADODB。Connection“ 是 Connection 物件的 ProgID,而 ”ADsDSOObject“ 是 ADSI 中 OLE DB 提供者的名稱。 如果未指定任何認證,則會使用目前登入用戶的認證。
下列程式代碼範例示範如何建立 Connection 對象的實例。
Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
下列程式代碼範例示範如何建立 Connection 對象的實例。
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>
下列程式代碼範例示範如何建立 Connection 對象的實例。 請注意,您必須將 ADO 類型庫 (msadoXX.dll) 包含在 Visual Basic 專案中的其中一個參考。
Dim Con As New Connection
con.Provider = "ADsDSOObject"
藉由設定 Connection 物件的屬性來指定使用者驗證數據。 下表列出 ADSI 支援的使用者驗證屬性。
財產 | 描述 |
---|---|
“使用者標識符” | 一個字串,用於識別在執行搜尋時其安全性內容被使用的使用者。 如需使用者名稱字串格式的詳細資訊,請參閱 IADsOpenDSObject::OpenDSObject。 如果未指定,則預設值為已登入的使用者,或由呼叫程式仿真的使用者。 |
密碼 | 字串,指定 「使用者識別碼」所識別之用戶的密碼。 |
「加密密碼」 | 布爾值,指定密碼是否加密。 預設值為 false 。 |
“ADSI 旗標” | 指定系結驗證選項之 ADS_AUTHENTICATION_ENUM 列舉中的一組旗標。 預設值為零。 |
下列程式代碼範例示範如何在建立 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.Command"。 這個物件可讓您使用使用中連接向 ADSI 發出查詢語句和其他命令。 Command 物件會使用其 ActiveConnection 屬性來維護作用中的連線。 它也會維護 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可接受的具名屬性。
命名的屬性 | 描述 |
---|---|
“異步” | 布爾值,指定搜尋是同步還是異步。 預設值為 False (同步)。 同步搜尋操作將會被阻擋,直到伺服器傳回整個結果,或在分頁搜尋的情況下,直到伺服器傳回整頁結果。 異步搜尋會阻塞執行,直到有一行搜尋結果可用或直到“Timeout”屬性所指定的時間過去為止。 |
「快取結果」 | 布爾值,指定是否應該在用戶端快取結果。 預設值為 true ;ADSI 會快取結果集。 對於大型結果集,可以考慮關閉此選項。 |
追求推薦 |
ADS_CHASE_REFERRALS_ENUM 的值,指定搜尋如何處理轉介。 預設值為 ADS_CHASE_REFERRALS_NEVER。如需此屬性的更多資訊,請參閱 參照。 |
「僅限欄位名稱」 | 布爾值,指出搜尋應該只擷取已指派值的屬性名稱。 預設值為 false 。 |
“Deref Aliases” | 布爾值,用於指定是否解析找到的對象別名。 預設值為 false 。 |
「頁面大小」 | 用來開啟分頁的整數值,並指定結果集中要傳回的物件的最大數目。 預設值為沒有頁面大小。 如需詳細資訊,請參閱 擷取大型結果集。 |
搜尋範圍 | 指定搜尋範圍的 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。