Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何尋找所有具遠端存取使用權限的使用者?


如何尋找具有遠端存取使用權限的所有使用者?

嗨,Scripting Guy!我要如何尋找具有遠端存取使用權限的所有使用者;也就是「撥號」或 「VPN」屬性設為允許的所有使用者呢?

-- RC

RC,您好。人們好像總在追尋什麼,尋覓真愛、快樂、生命意義。這些我們都幫不上忙,(我們本來以為可以為生命添加點意義,結果發現我們錯了)。不過沒關係。如果您要尋找所有具遠端存取使用權限的使用者,這點我們幫得上忙:
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

前面說過,尋找具有遠端存取使用權限的使用者清單不能算是尋找生命意義,但是我們寧可相信這是僅次於此的好事。


如需詳細資訊

請參閱嗨,Scripting Guy! - 過往文件

 

回到頁首 回到頁首