Scenario1.vbs

作者: The Scripting Guys,Microsoft Corporation

這個指令碼會在多部網路主機上起始 Windows XP Service Pack 2 的自動安裝及設定程序。Scenario1.vbs 會從文字檔取得遠端電腦的清單,並複製兩個指令碼 install.vbs 及 runonce.vbs 到每一台電腦,然後於每一台電腦上啟動第一個指令碼。

指令碼會在管理工作站上執行,而所有指令碼都必須位於相同的資料夾。執行指令碼的認證必須有每部主機的管理權限。

在基本的案例中,SP2 安裝檔案是位於可供清單上所有網路主機存取的遠端伺服器。若要針對 SP2 安裝複製到本機主機上,並從那裡執行的案例做變化的話,請將 install.vbs 重新命名為其他名稱 (例如 install-remote.vbs),然後將 install-local.vbs 重新命名為 install.vbs。同時也必須在 scenario1.vbs 和那些指令碼內所記錄的 install.vbs 中稍做變更。

其他指令碼會執行下列功能:

install.vbs

  • 從遠端伺服器執行 SP2 安裝。

  • 在主機上設定 AutoAdmin 及 RunOnce 登錄項目。

  • 將結果記錄到文字檔 computername-sp2-instlog.txt,並將檔案複製回管理工作站。

  • 強制執行重新開機,這樣就會自動啟動 runonce.vbs。

Runonce.vbs

  • 在重新開機之後首次執行,由 RunOnce reg 項目啟動。

  • 設定 Windows 防火牆允許某些程式並開啟某些連接埠。您必須編輯這些設定,才能反映網路的設定。

  • 在 Windows 防火牆上啟用遠端管理,這樣便能在這部主機上再次執行遠端指令碼和系統管理工具。

  • 重設 AutoAdmin 及 RunOnce 登錄項目。

  • 將結果記錄到文字檔 computername-sp2-clnuplog.txt,並將檔案複製回管理工作站。

  • 再次強制執行重新開機。

案例 1 以及每個指令碼的角色的進一步說明,都包含在位於以下網址的指令碼簡介中:http://www.microsoft.com/technet/scriptcenter/solutions/appcompat/default.mspx (英文)

Scenario1.vbs 對應於 StartRemoteIns.vbs 並增加其功能;StartRemoteIns.vbs 是《Application Compatibility Testing and Mitigation Guide for Window sXP Service Pack 2》(Window sXP Service Pack 2 應用程式相容性測試及緩和指南) 隨附的指令碼之一,並記錄在<附錄>中。您可以下載用來安裝該指南及其相關指令碼的 Windows Installer (.msi) 檔案,網址是:

http://www.microsoft.com/downloads/details.aspx?FamilyId=9300BECF-2DEE-4772-ADD9-AD0EAF89C4A7&displaylang=en (英文)

這個指令碼的輸入來自文字檔 computers.txt,它包含將執行指令碼的電腦名稱。

輸入檔案的每行都必須包含電腦名稱。每部電腦必須都能透過網路存取,而且指令碼用來執行的認證必須具有系統管理權限。例如:

client1 client2 client3 client4

確定最後一行後面沒有分行符號,因為指令碼會將它解譯為空字串。

若要使用指令碼,請複製程式碼並將它貼入「記事本」,然後將指令碼儲存為 scenario1.vbs。接著建立如上所述,其中每行都具有電腦名稱的文字檔,並將它儲存為和指令碼位於相同目錄的 computers.txt。若要執行指令碼,請將命令提示視窗開啟到指令碼的目錄,並輸入:

cscript scenario1.vbs

如果電腦上的預設指令碼裝載是 Cscript.exe,就可以省略開頭的 cscript。

指令碼


'******************************************************************************
'scenario1.vbs
'Author: Peter Costantini, the Microsoft Scripting Guys
'Date: 9/2/04
'This script runs on the admin workstation. It gets a list of remote machines
'from a text file, copies the scripts to each machine, and
'then launches the first script on each machine.
'All scripts must be in the same folder.
'******************************************************************************

On Error Resume Next

'Initialize global constants and variables.
Const FOR_READING = 1
g_strHostFile = "computers.txt"

'Read computer names for install from text file.
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(g_strHostFile) Then
  Set objTextStream = objFSO.OpenTextFile(g_strHostFile, FOR_READING)
Else
  WScript.Echo "Input file " & g_strHostFile & " not found."
  WScript.Quit
End If

'Loop through list of computers and perform tasks on each.
Do Until objTextStream.AtEndOfStream
  g_strComputer = objTextStream.ReadLine
  Wscript.Echo VbCrLf & g_strComputer
  Wscript.Echo String(Len(g_strComputer), "-")
'Ping host to ensure that it is accessible.
  blnPing = PingHost
  If blnPing = True Then
    Wscript.Echo g_strComputer & " responded to ping."
'Call functions and sub-routines and handle logic.
    blnCopyFiles = CopyFiles
    If blnCopyFiles = True Then
      Wscript.Echo "Files copied. Running configuration and SP 2 " & _
       "installation."
      RunRemote
    Else
      Wscript.Echo "ERROR: Unable to copy files. Operation failed."
    End If
  Else
    WScript.Echo "ERROR: " & g_strComputer & " did not respond to ping."
  End If
Loop
objTextStream.Close

'******************************************************************************

Function PingHost

Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & g_strComputer)
strPingResults = LCase(objExec.StdOut.ReadAll)
If InStr(strPingResults, "reply from") Then
  PingHost = True
Else
  PingHost = False
End If

End Function

'******************************************************************************

Function CopyFiles

'Copies install.vbs and runonce.vbs from admin workstation to host.
'These scripts should be in same directory as this script.
'If not, edit the filenames in the array to include full path.

strRemoteFolder = "\\" & g_strComputer & "\c$\temp-ac"
arrFiles = Array("install.vbs", "runonce.vbs")
'If running Service Pack 2 setup from file to be copied to local computer,
'comment out the previous line and uncomment the following two lines:
'arrFiles = Array("install.vbs", "runonce.vbs", _
' "WindowsXP-KB835935-SP2-ENU.exe")
'In this case, you must also rename install-local.vbs to install.vbs.


'Check for folder on host and 
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strRemoteFolder) Then
  objFSO.CreateFolder(strRemoteFolder)
  If Err = 0 Then
    WScript.Echo "Created folder " & strRemoteFolder & "."
  Else
    WScript.Echo "Unable to create folder " & strRemoteFolder & "."
    WScript.Echo "Error Number: " & Err.Number
    WScript.Echo "Error Source: " & Err.Source
    WScript.Echo "Error Description: " & Err.Description
    Err.Clear
    CopyFile = False
    Exit Function
  End If
End If

'Copy files.
intCount = 0
For Each strFile in arrFiles
  If objFSO.FileExists(strFile) Then
    objFSO.CopyFile strFile, strRemoteFolder & "\"
    If Err = 0 Then
      WScript.Echo "Copied file " & strFile & " to folder " & _
       strRemoteFolder & "."
      intCount = intCount + 1
    Else
      WScript.Echo "Unable to copy file " & strFile & "."
    End If
    Err.Clear
  Else
    WScript.Echo "File " & strFile & " not found."
  End If
Next

If (intCount = UBound(arrFiles) + 1) Then
  CopyFiles = True
Else
  CopyFiles = False
End If

End Function

'******************************************************************************

Sub RunRemote

'Runs Windows XP SP2 setup and configuration script on remote machine.
'Use cscript to insure that the script runs under cmd.exe
strScript = "cscript c:\temp-ac\install.vbs"

'Connect to WMI service on remote machine.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
 & g_strComputer & "\root\cimv2")
If Err <> 0 Then
  WScript.Echo "Error connecting to WMI on \\" & g_strComputer & "."
  WScript.Echo "Error number: " & Err.Number
  WScript.Echo "Error source: " & Err.Source
  WScript.Echo "Error description: " & Err.Description
  Error.Clear
  Exit Sub
End If

'Get a Win32_Process object.
Set objProcess = objWMIService.Get("Win32_Process")

'Create a new process and run strScript in it.
intReturn = objProcess.Create(strScript, , , intProcessID)
If intReturn = 0 Then
  WScript.Echo "Launched " & strScript & " to install Windows XP " & _
   "Service Pack 2 and prepare the computer for configuration." & VbCrLf & _
   "Process ID: " & intProcessID & "."
Else
  WScript.Echo "Error: " & strScript & " could not be started." & VbCrLf & _
   "Return code: " & intReturn & "."
End If

End Sub


如需線上對等支援,請加入 msnews.microsoft.com 新聞伺服器上的 microsoft.public.windows.server.scripting (英文) 社群。若您想要對範例指令碼或指令碼指南,提供意見、回報問題,請與 Microsoft TechNet (英文) 連絡。

免責聲明

此範例指令碼不支援任何 Microsoft 標準技術支援方案或服務。上述的範例指令碼係依「現況」提供,不附帶任何擔保。Microsoft 公司不提供任何的默示擔保,包括但不限於任何商業適售性及特定用途之適用性的默示擔保。您必須承擔此範例指令碼或文件所造成的一切風險。在任何情況下,無論是使用或無法使用此範例指令碼或文件所造成的損害 (包括但不限於營業之損失、營業之中斷、營業資訊之滅失及其他金錢損失),Microsoft 公司、作者群或此指令碼之創作、製造或散發有關之人員概不負責,即使 Microsoft 已經被告知損害發生之可能性亦同。

顯示: