This code uses WMI to install exe files (patches) from a folder on local computer to other computers on a network.
This demonstrates how to:
Create Explorer window with a TextArea in vbs and access the TextArea.
Use WMI to create a process on target computer and receive notification when it terminates.

Enjoy.

VB Code:
  1. Dim TApp
  2. Dim IEObj
  3. Dim tArea
  4. Dim tButton
  5.  
  6. Const HIDDEN_WINDOW = 12
  7. Const SHOW_WINDOW=1
  8.  
  9. 'Array of Patch files to install.
  10. Dim InstallFiles()
  11.  
  12. 'maximum of 100 workstations to install patches to.
  13. Dim wsNames(100)
  14. Dim numComputers
  15. Dim retVal
  16. Dim PatchFolder
  17.     'Create explorer window
  18.     Set IEObj=CreateObject("InternetExplorer.Application")
  19.     IEObj.Navigate "about:blank"
  20.     IEObj.Height=400
  21.     IEObj.Width=500
  22.     IEObj.MenuBar=False
  23.     IEObj.StatusBar=False
  24.     IEObj.ToolBar=0
  25.     set outputWin=IEObj.Document
  26.     outputWin.Writeln "<title>RemotePatchInstall version 1.0</title>"
  27.     outputWin.writeln "<HTA:APPLICATION ID='objPatchomatic' APPLICATIONNAME='Patchomatic' SCROLL='no' SINGLEINSTANCE='yes' WINDOWSTATE='normal'>"
  28.  
  29.     outputWin.writeln "<BODY  bgcolor=ButtonFace ScrollBar='No'>"
  30.     outputWin.writeln "<TABLE cellSpacing=1 cellPadding=1 width='75pt' border=1>"
  31.     outputWin.writeln "<TBODY>"
  32.    
  33.     outputWin.writeln "<TR>"
  34.     outputWin.writeln "<TD>"
  35.     outputWin.writeln "<P align=center><TEXTAREA name=Information rows=6 cols=57 style='WIDTH: 412px; HEIGHT: 284px'></TEXTAREA></P></TD></TR>"
  36.     outputWin.writeln "<TR>"
  37. '   outputWin.writeln "<TD><P align=center><INPUT id=button1 style='WIDTH: 112px; HEIGHT: 24px' type=button size=38 value='Install Patches' name=button1></P></TD>"
  38.     outputWin.writeln "</TR>"
  39.     outputWin.writeln "<TR>"
  40.     outputWin.writeln "<TD></TD></TR></TBODY></TABLE>"
  41.     outputWin.writeln "</BODY>"
  42.  
  43.     IEObj.Visible=True
  44.     'Get the Information textarea object from the window
  45.     set tempObj=outputWin.getElementsByName("Information")
  46.     objFound=false
  47.     'loop through its object to find what we need
  48.     For each objN in tempObj
  49.         if objN.name="Information" then
  50.             objFound=true
  51.             set tArea=objN
  52.         end if
  53.     next
  54.     'if we didnt find the object theres a problem
  55.     if ObjFound=False then
  56.         'so show an error and bail
  57.         MsgBox "Unable to access the TextBox on IE Window",32,"Error"
  58.         WScript.Quit
  59.     end if
  60.  
  61.  
  62.  
  63. '*************************
  64. 'ADMINS: The below is all you should really have to change.
  65. '*************************
  66.  
  67. 'Change this to the location of the patches that will be installed.
  68.         'they should be limited to the amout you try to install at one time.
  69.         'ALSO the order they are installed is how explorer would list them by alphabetically.
  70.     'So given file names:
  71.     'patch1.exe
  72.     'patch2.exe
  73.     'patch11.exe
  74.     'installation order would be patch1.exe,patch11.exe, patch2.exe
  75.  
  76. PatchFolder="C:\Patches\Install"
  77.  
  78. 'Change this to location where the patches will be copied to on remote cp. This directory must exist on remote computer.
  79. 'I have it hidden on all workstations.
  80. RemotePatchFolder="C:\Install\"
  81.  
  82. 'Workstation names to refer to as array
  83. wsNames(1)="192.168.0.10"
  84. wsNames(2)="192.168.0.11"
  85.  
  86. 'number of remote computers
  87. numComputers=2
  88. '**********************
  89. 'ADMINS: The above is all you should really have to change.
  90. '**********************
  91.  
  92. 'Copy files to remote computers.
  93.  
  94. 'Get a list of the executable file in the folder and put them into the InstallFiles array
  95. 'on return, retVal will be number of files found.
  96. retVal=GetPatchFileList (PatchFolder,InstallFiles)
  97.  
  98. 'for each file copy to remote computers
  99. For cc=1 to numComputers                        'for each computer
  100.     For i = 1 to retVal                             'for each file
  101.         Dim copySuccess
  102.         Dim SharedDriveFolder
  103.             'do a replacement on the : to $, this means you must have admin priv
  104.             'this is because i want to copy to  "\\remotecpname\c$\PathName"
  105.             SharedDriveFolder=replace(RemotePatchFolder,":","$")
  106.             'copy it from the PatchFolder to the path on destination computer
  107.             'USE: RemoteCopyFile (SourceFilePath,DestinationFilePath, RemoteComputerName)
  108.             CurrentCP=cc
  109.             copySuccess=RemoteCopyFile(PatchFolder & "\" & InstallFiles(i),SharedDriveFolder,wsNames(CurrentCP))
  110.         if copySuccess=true then
  111.                 tArea.Value=tArea.Value &  PatchFolder & "\" & InstallFiles(i) & " copy - OK" & vbcrlf
  112.         else
  113.             tArea.Value=tArea.Value &  PatchFolder & "\" & InstallFiles(i) & " copy - FAILED" & vbcrlf
  114.         end if
  115.     Next
  116. Next
  117.  
  118.  
  119. 'Install the files on remote computer
  120.  
  121. 'go through each filename and start that process on remote PC.
  122. 'for each file install them on the computers.
  123. For cc=1 to numComputers
  124.  
  125.     'if theres more than one patch
  126.     if retVal>1 then
  127.     For i=1 to retVal-1
  128.                 CurrentCp=cc
  129.        
  130.                 'Now create a process on remote computer
  131.                 'USE: CreateProcessandwait( ComputerName, ExecutablePathonRemoteComputer
  132.                 'Create a process on the remote computer and waits. Now this can return a program terminated which is ok,
  133.                 'if it returns cancelled it means the process was stopped, this could happen if the update required a
  134.                 'computer restart.
  135.        
  136.                 CreateProcessandWait wsNames(CurrentCP), RemotePatchFolder & InstallFiles(i) & " /quiet /norestart", tArea
  137.  
  138.     next
  139.     end if
  140.  
  141.     'do the last patch with a forcereboot
  142.     CreateProcessandWait wsNames(CurrentCP), RemotePatchFolder & InstallFiles(retVal) & " /quiet"  & " /forcereboot" , tArea
  143.  
  144. next
  145.  
  146. tArea.value=tArea.Value & "Script Complete!" & vbcrlf
  147.  
  148.  
  149. '****************************       FUNCTIONS
  150.  
  151. 'Get list of files in Folder.
  152.  
  153. Function GetPatchFileList(FileFolder, FileStringArray())
  154.  
  155.         'create file system object
  156.         Set objFS=CreateObject("Scripting.FileSystemObject")
  157.         'set the a variable to point to our folder with the patches in it.
  158.         Set objFolder=objFS.GetFolder(FileFolder)
  159.         'set the initial file count to 0
  160.         numPatches=0
  161.  
  162.         for each objFile in objFolder.Files
  163.         if UCase(Right(objFile.Name,4))=".EXE" then
  164.                 numPatches=numPatches+1
  165.  
  166.                 redim preserve FileStringArray(numPatches)
  167.                 FileStringArray(numPatches)=objFile.Name
  168.         end if
  169.  
  170.         next
  171.         GetPatchFileList=numPatches    
  172. End Function
  173.  
  174. 'Copy files to remote computer.
  175.  
  176. Function RemoteCopyFile(SrcFileName,DstFileName,DestinationComputer)
  177. Dim lRetVal
  178.         'create file system object
  179.         Set objFS=CreateObject("Scripting.FileSystemObject")
  180.  
  181.         lRetVal=objFS.CopyFile (SrcFileName, "\\" & DestinationComputer & "\" & DstFileName)
  182.         if lRetVal=0 then
  183.                 RemoteCopyFile=True
  184.         else
  185.                 RemoteCopyFile=False
  186.         end if
  187. End Function
  188.  
  189.  
  190. 'Create process on remote computer and wait for it to complete.
  191.  
  192. Function CreateProcessAndWait(DestinationComputer,ExecutableFullPath,OutPutText)
  193.         Dim lretVal        
  194.  
  195.         strComputer= DestinationComputer
  196.         Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2:Win32_Process")
  197.         Set objWMIServiceStart= GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2:Win32_ProcessStartup")
  198.  
  199.         Set objConfig = objWMIServiceStart.SpawnInstance_
  200.        
  201.         objConfig.ShowWindow = 1        'show window or use HIDDEN_WINDOW
  202.  
  203.  
  204.  
  205.         lretVal= objWMIService.Create(ExecutableFullPath, null, objConfig, intProcessID)        
  206.         if lretVal=0 then
  207.                 OutPutText.Value = OutPutText.Value & "Process created with ID of " & intProcessID & " on " & DestinationComputer & vbcrlf
  208.                 OutPutText.Value = OutPutText.Value & "     Waiting for process " & intProcessID & " to complete." & vbcrlf
  209.  
  210.                 WaitForPID strComputer, intProcessID,OutPutText
  211.         OutPutText.Value = OutPutText.Value & "Process complete." & vbcrlf
  212.         else
  213.                 OutPutText.Value = OutPutText.Value & "Unable to start process " & ExecutableFullPath & " on " & DestinationComputer & vbcrlf
  214.         end if
  215. End Function
  216.  
  217.  
  218. 'Wait for PRocess to complete
  219.  
  220. Function WaitForPID(ComputerName,PIDNUMBER,OutPutText)
  221. Dim ProcessNumber
  222.  
  223. Set objWMIServiceQ = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & ComputerName & "\root\cimv2")
  224. Set colItems = objWMIServiceQ.ExecQuery("Select * from Win32_Process",,48)
  225. For Each objItem in colItems
  226.         'check if this process is the one we are waiting for
  227.         if objItem.ProcessID=PIDNUMBER then
  228.         OutPutText.Value = OutPutText.Value & "Process Info:" & vbcrlf
  229.         OutPutText.Value = OutPutText.Value & " Description: " & objItem.Description & vbcrlf
  230.         OutPutText.Value = OutPutText.Value & " ExecutablePath: " & objItem.ExecutablePath  & vbcrlf
  231.         OutPutText.Value = OutPutText.Value & " Name: " & objItem.Name  & vbcrlf
  232.         OutPutText.Value = OutPutText.Value & " Status: " & objItem.Status  & vbcrlf
  233.         OutPutText.Value = OutPutText.Value & " ThreadCount: " & objItem.ThreadCount  & vbcrlf
  234.         ProcessNumber=objItem.ProcessID
  235.         end if
  236.  
  237. Next
  238.  
  239.         PidWaitSQL="SELECT TargetInstance.ProcessID " & " FROM __InstanceDeletionEvent WITHIN 4 " _
  240.         & "WHERE TargetInstance ISA 'Win32_Process' AND " _
  241.         & "TargetInstance.ProcessID= '" & ProcessNumber & "'"
  242.  
  243.         Set Events = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & ComputerName & "\root\cimv2").ExecNotificationQuery (PidWaitSQL)
  244.  
  245.  
  246.  
  247.         Set TerminationEvent = Events.nextevent
  248.         OutPutText.Value = OutPutText.Value & "Program " & TerminationEvent.TargetInstance.ProcessID & _
  249.         " terminated. " & vbcrlf
  250.         set TerminationEvent=Nothing
  251.         exit function
  252.        
  253. End Function


packetvb