Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何使用替代憑證搜尋 Active Directory?


如何使用替代憑證搜尋 Active Directory?

嗨,Scripting Guy!如何使用替代憑證搜尋 Active Directory?

-- PT

PT,您好。這個有什麼難的?只要是專欄 (兩個專欄) 的忠實讀者,應該會知道我們最喜歡答覆搜尋 Active Directory 的相關問題。為什麼?其實很簡單:因為我們也不是真的回答,而是推敲出指令碼,然後跳過解釋,直接請讀者參考雙部曲〈老兄,我的列表機咧?〉(Dude, Where's My Printer?) 以便取得更多資訊。想必讀者也知道,這種上班生活真是愜意啊。

但您的問題不一樣:指定替代憑證不巧在搜尋 Active Directory 的系列文章中未曾提過,表示我們不得不答覆這個問題了。真是不公平,千里迢迢趕來工作,竟然還要努力工作!

相信我們,這可不是美國該有的工作環境!

所以我們打算跟讀者打個商量:問題我們會回答,但是只針對指定替代憑證的指令碼討論。如需瞭解剩下的指令碼,或想進一步瞭解如何在 Active Directory 中進行搜尋,還是請您閱讀雙部曲〈老兄,我的列表機咧?〉吧!

如果我們每次 提一回就可以拿一元美金,不久就發財了。

下面的指令碼可以用替代憑證搜尋 Active Directory:

Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Properties("User ID") = "fabrikam\kenmyer"
objConnection.Properties("Password") = "A2sXrco1Fq1#om!"
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties("ADSI Flag") = 3
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://DC=fabrikam,DC=com' WHERE " _
        & "objectCategory='user'"  
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields("Name").Value
    objRecordSet.MoveNext
Loop

方才說過,今天我們指討論這四行用來指定替代憑證的程式碼:

objConnection.Properties("User ID") = "fabrikam\kenmyer"
objConnection.Properties("Password") = "A2sXrco1Fq1#om!"
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties("ADSI Flag") = 3

這下面四行程式碼唯有在您需要以替代憑證進行搜尋才會派上用場。也就是說,如果您並不是使用登入 Windows 的憑證,而是另一個使用者帳號來繫結至 Active Directory ,就需要這四行。如果您打算使用目前登入的憑證進行搜尋,只要把這四行程式碼從指令檔中移除就得了。

讀者應該已經猜出來了(物件參考 objConnection 就算是今天的贈品),這四行程式碼和和 ADO (ActiveX Data Objects) Connection物件的四個屬性有關。User IDPassword這兩個屬性名符其實,不過是繫結至 Active Directory 所使用的帳號使用者名稱和密碼。本例中使用 domain\user name 語法指定 User ID。我們也可以把使用者名稱指定為登入名稱 (例如,kenmyer) 或使用者的通用主要名稱 (Universal Principal Name,UPN):kenmyer@fabrikam.com,全看讀者的意思。

至於密碼,為了教學方便我們已經把它用硬式編碼插入指令碼。但我們不建議讀者這麼做,每次指令碼執行時應該要要求您輸入密碼。如果您不知道怎麼辦,別擔心,我們會一如往常介紹您逛逛其他的網頁(這次介紹的是《嗨,Scripting Guy!》專欄過去關於提示並遮蓋密碼的文章)。

現在就剩下兩個屬性要對付了。將 Encrypt Password 設定為 True 的目的是告訴指令碼將密碼通過網路傳送時要加密,這個值預設為 False。而 ADSI Flag則是用來指定驗證選項的位元遮罩屬性。值 3 其實是由兩個不同的屬性所構成的位元遮罩值。

 

常數 strong>說明
ADS_SECURE_AUTHENTICATION 1 要求安全驗證。這個旗標設定後,Active Directory 就會使用 Kerberos,並可能搭配 NTLM 來驗證用戶端。
ADS_USE_ENCRYPTION 2 要求 ADSI 在網路上交換資料時要使用加密。


您可以在 ADSI SDK 中找到更多有關 ADSI 旗標屬性的詳細資訊。

剩下來的就是最後一個動作:設定這四個屬性的值,就可以停手了。

不好意思,現在我們要去休息一下。畢竟我們今天完全沒有預料到要工作嘛!

For Each objPrinter in colInstalledPrinters
objPrinter.Delete_

Next

得了,這樣就能刪除本機印表機,而不影響網路印表機連線。您現在一定很慶幸詢問的是利用 Windows XP 和 Windows Server 2003 移除本機印表機,無須顧慮早期的作業系統版本。

好啦,我們會看看能否處理 Windows 2000 中的問題,這不是保證,但我們會查一查。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首