Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何從遠端啟動互動式共用處理?


如何從遠端啟動互動式共用處理?

嗨,Scripting Guy!如何從遠端啟動互動式共用處理?

-- IS

IS,您好。嗯,長話短說:您不能 (至少在 Windows XP 或 Windows Server 2003 上不能) 從遠端啟動互動式共用處理。在這兩個 Windows 版本上,從遠端啟動的任何處理都會在隱藏視窗中執行。因此所有共用處理都無法進行互動式作業,因為使用者根本看不見它們。處理會盡責地執行工作,例如,顯示對話方塊。但是使用者永遠無法看見,因而也無法回應該對話方塊。換句話說,處理將會靜候等待,就像 B 級通俗電影裡的女演員靜坐在窗邊,等待久別的情人自海上歸來。

您說得一點都沒錯!這種說法對指令碼專欄來說,實在是太詩情畫意了!「嗨,Scripting Guy!」你每天哪來的指令碼處方,還外帶文藝素養,一應俱全哪!

信不信由你!在隱藏視窗中執行處理,至少有一部份算是件好事:它能減少駭客入侵的風險,駭客會顯示假冒的對話方塊,要求使用者輸入密碼或信用卡號碼。(這倒提醒了我們:如果您還沒有透過電子郵件,將密碼和信用卡號碼寄給我們,請您...呃,算我沒說。律師又在背後偷看了)。

換句話說,在隱藏視窗執行處理的好處是有助保護您和您的使用者,當然也會有壞處,那就是大大限制了您從遠端執行的能力,讓您無法從遠端啟動指令碼或其他需要使用者互動的處理。

不過嘛,您也知道指令碼處理的情況:就因為您不能進行某項作業,並不表示您就完全無法執行某項作業。而是只要設法變通一下,就能解決問題。我們這裡碰巧就找到了變通的辦法:

Const OverwriteExisting = TRUE
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "C:\Scripts\Interactive.vbs", _
    "\\atl-ws-01\C$\Scripts\", OverWriteExisting
strComputer = "atl-ws-01"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create _
    ("wscript.exe c:\scripts\interactive.vbs", "********084500.000000-420", _
        False, 2, , True, JobID)

前面已經說過,從遠端啟動的處理都是在不可見的視窗中執行,這是無法改變的事實。如果想要執行與使用者互動的處理,就必須在本機啟動該處理。我們的辦法就是從本機啟動該處理。在指令碼的第一部份中,我們將檔案 C:\Scripts\Interactive.vbs 複製至遠端電腦 atl-ws-01 上的 Scripts 資料夾中。(請注意,我們是使用管理共用 – C$ -- 來執行這項作業。如果 C:\Scripts 設定作為其他共用,也可以改用「標準」UNC 路徑,如 \\atl-ws-01\scripts)。下列指令碼可複製該檔案,覆寫 Scripts 資料夾中可能會有的其他 Interactive.vbs 檔案:

objFSO.CopyFile "C:\Scripts\Interactive.vbs", _
    "\\atl-ws-01\C$\Scripts\", OverWriteExisting

如此即可將 Interactive.vbs 檔案複製至遠端電腦。但是問題來了,要如何執行該指令碼,更重要的是,要如何從本機執行該指令碼?

雖然有好幾種方法,但我們選擇建立排程工作,然後透過該工作,在遠端電腦上啟動指令碼。我們是先在「在遠端電腦上」繫結至 WMI 服務,然後使用「Get」方法,連接至 Win32_ScheduledJob 類別。下列程式碼就是執行這些動作:

strComputer = "atl-ws-01"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")

在我們的範例指令碼中,假定時間是星期二上午,而您要讓互動式共用處理在上午 8:45 執行;以下這行怪異的指令碼就是執行這項作業:

errJobCreated = objNewJob.Create _
    ("wscript.exe c:\scripts\interactive.vbs", "********084500.000000-420", _
        False, 2, , True, JobID)

限於篇幅,我們無法在這期專欄中詳細說明 Win32_ScheduledJob「Create」方法的所有參數;如果您需要了解其中各項細節,請參閱《Microsoft Windows 2000 Scripting Guide》(英文) 中的相關部分。總而言之,我們設定的就是下列參數:


參數 說明
"wscript.exe c:\scripts\interactive.vbs" 要執行之指令碼/可執行檔的路徑。既然這應該是互動式共用處理,我們明確地呼叫 wscript.exe 做為指令碼裝載,如此有助確保互動式項目 (例如,使用 Wscript.Echo 建立的訊息方塊) 確實會以互動式項目出現。
"********084500.000000-420" 工作該執行的時間,使用的是 UTC (Universal Time Coordinate) 格式。我們今天就不說明 UTC 格式了,如需詳細資訊,請參閱《Scripting Guide》(英文)。現在您只需要管兩件事情:0845 (代表 24 小時時間格式的 8:45 AM) 和「-420」(代表您的時區與格林威治標準時間的時間差)。依您要指令碼執行的時間與電腦所在時區而定,您可能需要變更其中一個值或兩個值都變更。
False 表示排程工作是否要重複執行。由於我們只要執行這項工作一次,因此將值設定為 False。
2 排程工作所需執行的天數。
  指定一個月之中,工作應該執行的日子。由於這個參數只在排定多次執行工作時才會使用,因此就保留為空白。
True 表示排程工作是互動式,且應該在可見視窗中執行。如果這個參數設為 False (這是預設值),指令碼就會在隱藏視窗中執行,糟糕!
JobID 存放指定給新工作之工作識別碼的 Out 參數。


執行指令碼,在上午 8:45 時,Interactive.vbs 應該會在遠端電腦 atl-ws-01 上啟動執行。更重要的是,由於 Interactive.vbs 是在本機啟動,它會在可見視窗中執行,因此完全可以進行互動:使用者可以存取指令碼中使用的任何訊息方塊、對話方塊,或其他互動式項目。

就像我們說過了的,這個變通辦法有點麻煩。可是至少很管用,其他都不重要。

哦,另外還讓「嗨,Scripting Guy!」顯得更有文化氣息和素養!也許我們下一期專欄就專門討論抑揚格五音步詩;豈不是更高尚,酷斃了!

你們有誰知道什麼叫「抑揚格五音步詩」嗎?


如需詳細資訊

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

 

回到頁首 回到頁首