objCommand.CommandText = _ "SELECT sAMAccountName FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " _ "AND givenName='Ken' AND sn='Myer'" Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst Do Until objRecordSet.EOF Wscript.Echo objRecordSet.Fields("sAMAccountName").Value objRecordSet.MoveNext Loop
您可能已經(jīng)發(fā)現(xiàn)了,這是一個用于搜索 Active Directory 的腳本。我們不打算逐個解釋此腳本中使用的每一行代碼,那樣會花費太多時間。如果您不熟悉 Active Directory 搜索腳本,建議您看一下我們的兩篇“腳本故事”系列文章 Dude:Where's My Printer? 您在此腳本中看到的所有看起來怪怪的東西 - ADsDSOObject、DS_SCOPE_SUBTREE、ADODB.Command - 在這兩個專欄中都有詳細(xì)的解釋。
但是,我們將指出與用于進(jìn)行搜索的查詢有關(guān)的幾件事情。在編寫用于搜索 Active Directory 的腳本時,最難的部分也許就是知道要搜索的屬性名。例如,您提到的用戶登錄名。我們知道用戶登錄名的意思,您也知道用戶登錄名的意思,但是 Active Directory 不知道用戶登錄名是什么。Active Directory 會改為調(diào)用 sAMAccountName。(注意:盡管字母的大小寫無關(guān)緊要,但是我們會將此屬性名寫作 sAMAccountName,僅僅是因為這是該屬性的正式名稱而已。因而,SQL 查詢將檢索指定用戶的 sAMAccountName。
那么如何指定該用戶呢?嗯,我們要查找符合以下三個條件的 Active Directory 對象:
• 是用戶帳戶。為了將返回的數(shù)據(jù)限制為用戶帳戶,我們要搜索 objectCategory 等于 user 的項。
• 名字為 Ken。當(dāng)然,Active Directory 不知道什么是“名字”。因此,我們需要搜索 givenName 為 Ken 的用戶。
objCommand.CommandText = _ "SELECT sAMAccountName FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " _ "AND givenName='Ken' AND sn='Myer'"
剩下的就很容易了。執(zhí)行此查詢,Active Directory 將返回一個記錄集,該記錄集由 giveName 為 Ken 且 sn 為 Myer 的所有用戶組成。然后,設(shè)置一個 Do Until 循環(huán)來遍歷該記錄集,并回顯每個用戶的 sAMAccountName。(理想的情形為,Active Directory 中只有一個 Ken Myer,但是實際上可能會有多個同名同姓的用戶。在這種情況下,sAMAccountName 將是一個區(qū)別因素,因為 sAMAccountNames 必定是唯一的。)
明白一些了吧?好了,看(不要告訴任何人是我們說的),拿剛才向您介紹的腳本來說,用 John 替換 Ken、用 Smith 替換 Myer,您將得到用于搜索名為 John Smith 的用戶的腳本。但是,這只是您和我們之間的秘密,好嗎?好