使用 ActiveX 資料物件搜尋 (ADO)
ActiveX Data Object (ADO) 模型是由下表所列的物件所組成。
Object | 描述 |
---|---|
[連接] | OLE DB 數據源的開啟連線,例如 ADSI。 |
命令 | 定義要針對數據源執行的特定命令。 |
參數 | 要提供給命令物件之任何參數的選擇性集合。 |
記錄 | 數據表、命令物件或 SQL 語法中的一組記錄。 您可以建立記錄集,而不需要任何基礎連接物件。 |
欄位 | 記錄集中的單一數據行。 |
屬性 | 由 ADO 提供者提供的值集合。 |
錯誤 | 包含資料存取錯誤的相關資料。 在單一作業中發生錯誤時重新整理。 |
若要讓 ADO 與 ADSI 通訊,至少必須有兩個 ADO 物件:連線 ion 和 RecordSet。 這些 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。