嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:要如何驗證 ADAM 已經安裝了?


要如何驗證 ADAM 已經安裝了?

嗨,Scripting Guy!要如何驗證 ADAM 已經安裝了?

-- CW

CW,您好。美國前總統雷根的名言是「要信任,但也要查證 (Trust but verify)」,我們一直覺得這句話很有系統管理員的味道:「您說已經在系統上安裝了 ADAM,我當然相信,只是想查證一下。裝或沒裝差很多。」

到底要如何驗證 ADAM (Active Directory Application Mode) 已經安裝在電腦上了?可以用指令碼來解決這個問題 (感謝前雷根總統):

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name Like '%ADAM_%'")
If colServices.Count = 0 Then
    Wscript.Echo "ADAM is not installed."
Else
    For Each objService in colServices
        Wscript.Echo objService.Name & " -- " & objService.State
    Next
End If

這個指令碼看準了 ADAM 以服務型態執行的這個特性:如果指令碼找到 ADAM 服務的執行個體,就表示 ADAM 已經安裝了。但是這裡的確有個麻煩的地方,ADAM 的每一個執行個體是以不同的名稱分開執行的服務。所幸有個簡單的方法可以判斷是否已經安裝了任何 ADAM 的執行個體。而那正是我們下面要討論的重點:

指令碼會先接著連接到本機電腦上的 WMI 服務,當然您也可以修改指令碼使它連接到遠端電腦,只要對 strComputer 變數指定遠端電腦的名稱即可。接著要處理這行程式碼:

Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name Like '%ADAM_%'")

這一行指令碼的意思是使用 Like 運算子,把所有包含 ADAM_ 字元的服務傳回。WMI 的 LIKE 運算子搭配兩個百分比符號表示「任何東西」,這個查詢白話點說,就是「把 Name 屬性裡所有包含 ADAM_ 字元的服務都逮過來,我不管 ADAM_ 前面或後面接的是什麼東西,只要 Name 隨便哪裡有 ADAM_ 字串就得了。」

這麼做有什麼原因嗎?方才說過,ADAM 的每一個值行個體是以個別服務的型態來執行,但是每一個服務名稱一定會以 ADAM_ 字元開頭。舉個例子,如果 ADAM 有一個叫做 Fabrikam 的執行個體,服務名稱就等於 ADAM_Fabrikam。ADAM 的執行個體如果叫做 Contoso,服務名稱就是 ADAM_Contoso。所以我們才這樣設計查詢,以便能夠像上面兩個例子一樣,傳回 Name 中包含 ADAM_ 字元的服務。

 

附註:這時候您可能會這麼想:「等等,Scripting Guy,LIKE 運算子不是只有在 Windows XP 和 Windows Server 2003 才支援嗎?萬一我在 Windows 2000 上執行 ADAM 怎麼辦?」沒錯,LIKE 運算子只有在 Windows XP 和 Windows Server 2003 才支援,但這不是問題。因為根本就不能在 Windows 2000 上面執行 ADAM,更不用擔心是不是安裝了。所以就假設必須在 Windows XP 或 Windows Server 2003 電腦上執行這個指令碼。如果您要使用 ADAM,應該不難找到這些電腦。


擷取到服務集合後,接著是 Then Else 區塊:

If colServices.Count = 0 Then
    Wscript.Echo "ADAM is not installed."
Else
    For Each objService in colServices
        Wscript.Echo objService.Name & " -- " & objService.State
    Next
End If

這裡的動作是檢查傳回集合的 Count 屬性是否等於 0,用來判斷及合理有多少項目。假使 Count 等於 0,表示集合裡有 no 個項目。換句話說,電腦上並沒有安裝 ADAM 的執行個體,因為因應的訊息已經明白指出。

如果 Count 大於 0,就表示至少找到一個 ADAM 的執行個體。我們已經準備了一個簡單的 For Each 迴圈,逐一處理所有的 ADAM 執行個體,並針對每一項傳回 Name 和 State 的執行個體 (執行中、已停止、暫停等)。

這樣就行了,只要執行這個指令碼,然後... 啊?還懷疑嗎?我知道了,要信任,也要查證!這我們懂,但這是兩回事,不妨試試,看會有什麼結果。


如需詳細資訊

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

 

回到頁首 回到頁首