On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
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' " & _
"AND msNPAllowDialin = TRUE"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
我們總是奉勸大家,想找什麼,從 Active Directory 開始搜尋準沒錯。這段指令碼就是很好的例子。您要在 Active Directory 中,尋找 [撥號] 索引標籤中,已選取 [允許存取] 選項的使用者:
其實 [遠端存取使用權限 (撥入或 VPN)] 選項相當於 Active Directory 中的 msNPAllowDialin 屬性。如果允許存取,則 msNPAllowDialin 為 True。如果拒絕存取,則 msNPAllowDialin 為 False。如果 msNPAllowDialin 沒有值,就表示已選取 [透過遠端存取原則來控制存取] 選項。
換句話說,想尋找所有具遠端存取使用權限的使用者,只需要搜尋 msNPAllowDialin 屬性為 True 的使用者帳戶即可。我們不會長篇大論描述搜尋 Active Directory 的程式碼;我們的雙部曲《指令碼物語》(Tales from the Script) 專欄系列的〈老兄,我的印表機咧?〉(Dude, Where My Printer?) 會提供相關的詳細說明。不過,我們將示如何範擷取這些使用者的查詢:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin = TRUE"
這裡我們要尋找 objectCategory 等於使用者 (換句話說,相對於群組帳戶或電腦帳戶,我們要尋找使用者帳戶) 還有 msNPAllowDialin 屬性為 True 的所有 Active Directory 物件。若要尋找被拒絕存取的所有使用者,我們會搜尋 msNPAllowDialin 值等於 False 的使用者:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin = FALSE"
那麼透過原則來決定遠端存取的使用者該又怎麼查詢呢?這時候我們可以搜尋未設定 msNPAllowDialin 值的使用者:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin <> '*'"
沒錯,看起來好像不太正常,但是 ADSI 中的星號是可以代表任何東西的萬用字元。咱們在這個查詢中要求一份使用者清單,使用者的 msNPAllowDialin 屬性不等於任何值。簡單來說,清單中只顯示 msNPAllowDialin 屬性沒有值的所有使用者,包含其他值 (True 或 False) 的使用者都將排除在外。如此一來,這項查詢傳回的使用者將會是透過原則決定遠端存取的使用者。(對了,這是預設設定;若未另行指定,使用者的遠端存取使用權限將由原則決定)。
呼,都瞭解了嗎?把符合條件的使用者的資料錄集傳回後,只需要使用以下幾行程式碼循環處理清單,回應每個使用者名稱即可:
:
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
前面說過,尋找具有遠端存取使用權限的使用者清單不能算是尋找生命意義,但是我們寧可相信這是僅次於此的好事。 |