WSH

操作系統中的腳本語言工作環境

WSH是“Windows Scripting Host”的縮略形式,其通用的中文譯名為“Windows腳本宿主”。對於這個較為抽象的名詞,可以先作這樣一個籠統的理解:它是內嵌於 Windows操作系統中的腳本語言工作環境。

簡介


Windows Scripting Host 這個概念最早出現於 Windows 98 操作系統。大家一定還記得 MS-Dos 下的批處理命令,它曾有效地簡化了工作、帶給方便,這一點就有點類似於如今大行其道的腳本語言。但就算把批處理命令看成是一種腳本語言,那它也是 98 版之前的 Windows 操作系統所唯一支持的“腳本語言”。而此後隨著各種真正的腳本語言不斷出現,批處理命令顯然就很是力不從心了。面臨這一危機,微軟在研發 Windows 98 時,為了實現多類腳本文件在 Windows 界面或 Dos命令提示符下的直接運行,就在系統內植入了一個基於 32 位 Windows 平台、並獨立於語言的腳本運行環境,並將其命名為“Windows Scripting Host”,WSH 架構於 ActiveX 之上,通過充當 ActiveX 的腳本引擎控制器,WSH 為 Windows 用戶充分利用威力強大的腳本指令語言掃清了障礙。
再具體一點描述:你自己編寫了一個腳本文件,如後綴為 .vbs 或 .js 的文件,然後在 Windows 下雙擊並執行它,這時,系統就會自動調用一個適當的程序來對它進行解釋並執行,而這個程序,就是 Windows Scripting Host,程序執行文件名為 Wscript.exe (若是在命令行下,則為 Cscript.exe)。

推廣


WSH 誕生后,在 Windows 系列產品中很快得到了推廣。除 Windows 98 外,微軟在 Internet Information Server 4.0、Windows Me、Windows 2000 Server,以及 Windows 2000 Professional 等產品中都嵌入了 WSH。早期的 Windows 95 也可單獨安裝相應版本的 WSH。

作用


WSH 的設計,在很大程度上考慮到了“非交互性腳本(noninteractive scripting)”的需要。在這一指導思想下產生的 WSH,給腳本帶來非常強大的功能,例如:可以利用它完成映射網路驅動器、檢索及修改環境變數、處理註冊表項等工作;管理員還可以使用 WSH 的支持功能來創建簡單的登陸腳本,甚至可以編寫腳本來管理活動目錄。
而事實上,上述功能的實現,均與 WSH 內置的多個對象密切相關,這些內置對象肩負著直接處理腳本指令的重任。因此,也可以通過了解 WSH 的內置對象來探尋 WSH 可以實現的功能。
圖 1 是 WSH 的內置對象構成情況。
圖1
圖1
從圖中可以看出,WSH 共有 14 個內置對象,它們各自有著明確分工。具體而言,位於最底部的 Wscript ,主要作用是提取命令行變數,確定腳本文件名,確定 WSH 執行文件名(wscript.exe 還是cscript.exe),確認 host 版本信息,創建、關連及分離 COM 對象,寫入事件,按程序結束一個腳本文件的運行,向默認的輸出設備(如對話框、命令行)輸出信息等;WshArguments的作用是獲取全部的命令行變數; WshNamed 負責獲取指定的命令行參數集;WshUnnamed 負責獲取未經指定的命令行參數集;WshNetwork 的主要作用是開放或關閉網路共享,連接或斷開網路印表機,映射或取消網路中的共享,獲取當前登陸用戶的信息;WshController 可以創建一個遠程腳本對象;WshRemote 可以實現網路中對計算機系統的遠程管理,也可按計劃對其它程序/腳本進行處理;WshRemote Error 的作用在於:當一個遠程腳本(WshRemote 對象)因腳本錯誤而終止時,獲取可用的錯誤信息;WshShell 主要負責程序的本地運行,處理註冊表項、創建快捷方式、獲取系統文件夾信息,處理環境變數;WshShortcut 主要用於按計劃創建快捷方式;WshSpecialfolders 用於獲取任意一個 Windows 特殊文件夾的信息;WshURLShortcut 用於按程序要求創建進入網際網路資源的快捷方式;WshEnvironment 用於獲取任意的環境變數(如 WINDIR, PATH, 或 PROMPT);WshScriptExec 用於確定一個腳本文件的運行狀態及錯誤信息。
在這些內置對象的幫助下,就可以利用 WSH 充分發揮 VBScript 及 JScript 等腳本的強大威力,極大地提高工作效率。

工作原理


圖 2
圖 2
WSH的工作流程,實際上就是腳本文件被解析並執行的過程。知道,腳本經常會被植入網頁,其中包括 HTML 頁面(客戶機端)和 ASP 頁面(伺服器端)。對於植入 HTML 頁面的腳本,其所需的解析引擎會由 IE 這樣的網頁瀏覽器載入;對於植入 ASP 頁面的腳本,其所需的解析引擎會由 IIS(Internet Information Services)提供。
而對於出現在 HTML 和 ASP 頁面之外的腳本(它們常以獨立的文件形式存在),就需要經由 WSH 來處理了。在這裡要插一句“廢話”:WSH 的正常工作的前提,是你必須安裝了微軟3.0 或更高版本的 IE,因為 WSH 在工作時會調用 IE 中的 VBScript 和 JScript 解析引擎。
來看看腳本文件經由 WSH 執行的過程。為了更加直觀,筆者根據有關資料繪製了一幅工作流程圖(圖2),從圖中大家能對 WSH 在腳本文件運行中所起到的作用有個理性認識。對於這個流程圖,還需要補充兩點:1、圖中第(2、3)步,WSH 根據腳本文件後綴名,到系統註冊表中查詢所需的腳本引擎時,VBScript 和 JScript 兩種語言的解析引擎是 Windows 系統中原有的,而其它腳本語言的解析引擎,如 PERL、TCL等,需要用戶另行定義;2、第(5)步執行腳本命令時,一些腳本指令會使用到 WSH 內置對象所提供的服務(參見本文第二部分),例如處理註冊表項。這時,腳本指令就會向 WSH 提出請求,並由 WSH 完成所需任務。也正是在這一步,WSH 的功用得到了淋漓盡致的發揮。

應用


談到這個問題,就不太好講了。正如前面所述,WSH 實際上是一個腳本語言的運行環境,它之所以具備強大的功能,是在於充分挖掘了腳本語言的潛力。因此,如果拋開腳本語言而空談 WSH ,那實際上就沒有了意義。而如果再展開來講述腳本語言,顯然就離開了今天的主題。
在這種情況下,只好採取一種折衷的方法:給大家推薦幾個腳本文件利用 WSH 執行任務的實例,希望大家能通過這些例子對 WSH 的使用有一個初步的了解。
腳本文件的編寫十分方便,你可以選用任意一個文字編輯軟體進行編寫,寫完后,你只需將它保存為 WSH 所支持的文件名就行了(如 ..js 文件、.vbs 文件)。最常用的編輯器當然就是記事本(Notepad)了,下面的實例都是以它作為工具編寫的。
準備好了嗎?先來看一個最簡單的例子吧。打開記事本,在上面寫下:
WScript.Echo("走近 WSH")
好了,將它保存為以 ..vbs 或 .js 為後綴名(可千萬不要弄成了 ..txt)的文件並退出記事本。雙擊執行這個文件,看看結果吧,是不是很有意思?
有了第一印象后,繼續往下看。
這一次,要利用 WSH 完成一次創建十個文件夾的工作。代碼如下:
dim objdir
set objdir=wscript.createobject("scripting.filesystemobject")
for k=1 to 10
anewfolder="c:\chapter" & k
objdir.createfolder(anewfolder)
next
同樣,將它存為 .vbs 文件並退出。運行后,會發現,C 盤根目錄下一次性多出了十個新文件夾。
最後,再舉一個在伺服器上的運用。下面的代碼將幫助你重新啟動指定的 IIS 服務:
' define a constant for stopped services
Const ADS_SERVICE_STOPPED = 1
' get an ADSI object for a computer
Set objComputer = GetObject("WinNT://MYCOMPUTER,computer")
' get an object for a service
Set objService = objComputer.GetObject("Service","MYSERVICE")
' check to see if the service is stopped
If (objService.Status = ADS_SERVICE_STOPPED) Then
' if the service is stopped, then start it
objService.Start
End If
將它以 startsvc.vbs 為名保存在 C: 盤根目錄。並通過如下命令執行:CSCRIPT C:\STARTSVC.VBS 。運行后,經你指定的 IIS 服務項將被重新開啟。
已經舉了三個例子,其實,在 Windows 的 samples 目錄下,有個 WSH 文件夾,那裡面有不少很具代表性的 .vbs 和 .js腳本文件。大家有空可以打開來看看,相信會受益匪淺的。
此外,利用 WSH ,還可以自己編寫腳本文件來提高網路管理方面的效率。但由於受條件限制,本人在這方面的使用心得並不多,因此也就不好多說了^_^。不過,網上這方面現成的代碼倒是很多,大家有興趣可以去研究一下。

缺陷


答案當然是肯定的。任何事物都有兩面性,WSH 也不例外。應該說,WSH 的優點在於可以充分利用腳本來實現計算機工作的自動化;但不可否認,也正是它的這一特點,使系統又有了新的安全隱患。許多計算機病毒製造者正在熱衷於用腳本語言來編製病毒,並利用 WSH 的支持功能,讓這些隱藏著病毒的腳本在網路中廣為傳播。2000年曾名燥一時的 I Love You 便是一個典型代表。因此,大家對於來歷不明、尤其是郵件附件里的一些腳本文件還是應該保持戒備。至於相應的防範措施,筆者在別的文章中已有論述,在此就不再啰嗦了。
以上文字,希望能對大家認識 WSH 有所幫助。在運用過程中,大家若有什麼心得或發現,別忘了一起分享。