home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / ras.cab / exec.vbs < prev    next >
Text File  |  1999-11-04  |  26KB  |  751 lines

  1. '********************************************************************
  2. '*
  3. '* File:           Exec.Vbs
  4. '* Created:        March 1999
  5. '* Version:        1.0
  6. '*
  7. '*  Main Function:  Executes a command.
  8. '*
  9. '*  Exec.vbs  [/e <Command> | /x <ProcessID>] [/S <server>] [/U <username>] [/W <password>] 
  10. '*            [/O <outputfile>]
  11. '*
  12. '* Copyright (C) 1999 Microsoft Corporation
  13. '*
  14. '********************************************************************
  15.  
  16. OPTION EXPLICIT
  17.  
  18.     'Define constants
  19.     CONST CONST_ERROR                   = 0
  20.     CONST CONST_WSCRIPT                 = 1
  21.     CONST CONST_CSCRIPT                 = 2
  22.     CONST CONST_SHOW_USAGE              = 3
  23.     CONST CONST_EXECUTE                 = 4
  24.     CONST CONST_KILL                    = 5
  25.  
  26.  
  27.     'Declare variables
  28.     Dim intOpMode, i, intProcessID
  29.     Dim strServer, strUserName, strPassword, strOutputFile, strCommand
  30.  
  31.     'Make sure the host is csript, if not then abort
  32.     VerifyHostIsCscript()
  33.  
  34.     'Parse the command line
  35.     intOpMode = intParseCmdLine(strServer     ,  _
  36.                                 strUserName   ,  _
  37.                                 strPassword   ,  _
  38.                                 strOutputFile ,  _
  39.                                 strCommand    ,  _
  40.                                 intProcessID     )
  41.  
  42.  
  43.     Select Case intOpMode
  44.  
  45.         Case CONST_SHOW_USAGE
  46.             Call ShowUsage()
  47.  
  48.         Case CONST_EXECUTE
  49.             Call ExecuteCmd(strServer    , _
  50.                            strOutputFile , _
  51.                            strUserName   , _
  52.                            strPassword   , _
  53.                            strCommand      )
  54.  
  55.         Case CONST_KILL
  56.             Call Kill(strServer    , _
  57.                       strOutputFile , _
  58.                       strUserName   , _
  59.                       strPassword   , _
  60.                       intProcessID    )
  61.  
  62.  
  63.         Case CONST_ERROR
  64.             'Do Nothing
  65.  
  66.         Case Else                    'Default -- should never happen
  67.             Call Wscript.Echo("Error occurred in passing parameters.")
  68.  
  69.     End Select
  70.  
  71.  
  72. '********************************************************************
  73. '*
  74. '* Sub ExecuteCmd()
  75. '*
  76. '* Purpose: List the desktop properties on a system.
  77. '*
  78. '* Input:   strServer           a machine name
  79. '*          strOutputFile       an output file name
  80. '*          strUserName         the current user's name
  81. '*          strPassword         the current user's password
  82. '*          strCommand          a valid WBEM command
  83. '*
  84. '* Output:  Results are either printed on screen or saved in strOutputFile.
  85. '*
  86. '********************************************************************
  87. Private Sub ExecuteCmd(strServer     , _
  88.                        strOutputFile , _
  89.                        strUserName   , _
  90.                        strPassword   , _
  91.                        strCommand      )
  92.  
  93.  
  94.     ON ERROR RESUME NEXT
  95.  
  96.     Dim objFileSystem, objOutputFile, objService, objInstance 
  97.     Dim strQuery, strMessage
  98.     Dim intProcessId, intStatus
  99.  
  100.     'Open a text file for output if the file is requested
  101.     If Not IsEmpty(strOutputFile) Then
  102.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  103.             Call Wscript.Echo ("Could not open an output file.")
  104.             Exit Sub
  105.         End If
  106.     End If
  107.  
  108.     'Establish a connection with the server.
  109.     If blnConnect("root\cimv2" , _
  110.                    strUserName , _
  111.                    strPassword , _
  112.                    strServer   , _
  113.                    objService  ) Then
  114.         Call Wscript.Echo("")
  115.         Call Wscript.Echo("Please check the server name, " _
  116.                         & "credentials and WBEM Core.")
  117.         Exit Sub
  118.     End If
  119.  
  120.  
  121.     strMessage = ""
  122.     intProcessId = 0
  123.  
  124.     Set objInstance = objService.Get("Win32_Process")
  125.     If blnErrorOccurred(" occurred getting a " & _
  126.                         " Win32_Process class object.") Then Exit Sub
  127.  
  128.     If objInstance is nothing Then Exit Sub
  129.  
  130.     intStatus = objInstance.Create(strCommand, null, null, intProcessId)
  131.     If blnErrorOccurred(" occurred in creating process " & _
  132.                           strCommand & ".") Then Exit Sub
  133.  
  134.     If intStatus = 0 Then
  135.         If intProcessId < 0 Then
  136.             '4294967296 is 0x100000000.
  137.             intProcessId = intProcessId + 4294967296
  138.         End If
  139.         strMessage = "Succeeded in executing " &  strCommand & "." & vbCRLF
  140.         strMessage = strMessage & "The process id is " & intProcessId & "."
  141.     Else
  142.         strMessage = "Failed to execute " & strCommand & "." & vbCRLF
  143.         strMessage = strMessage & "Status = " & intStatus
  144.     End If
  145.     WriteLine strMessage, objOutputFile
  146.  
  147.     If IsObject(objOutputFile) Then
  148.         objOutputFile.Close
  149.         Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
  150.     End If
  151.  
  152. End Sub
  153.  
  154. '********************************************************************
  155. '*
  156. '* Sub Kill()
  157. '*
  158. '* Purpose: Kills a process currently running on a machine.
  159. '*
  160. '* Input:   strServer           a machine name
  161. '*          strOutputFile       an output file name
  162. '*          strUserName         the current user's name
  163. '*          strPassword         the current user's password
  164. '*          intProcessId        id of the process to be killed
  165. '*
  166. '* Output:  Results are either printed on screen or saved in strOutputFile.
  167. '*
  168. '********************************************************************
  169. Private Sub Kill(strServer     , _
  170.                  strOutputFile , _
  171.                  strUserName   , _
  172.                  strPassword   , _
  173.                  intProcessID    )
  174.  
  175.  
  176.     ON ERROR RESUME NEXT
  177.  
  178.     Dim objFileSystem, objOutputFile, objService, objInstance
  179.     Dim strWBEMClass, strMessage
  180.     Dim intStatus
  181.  
  182.     'Open a text file for output if the file is requested
  183.     If Not IsEmpty(strOutputFile) Then
  184.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  185.             Call Wscript.Echo ("Could not open an output file.")
  186.             Exit Sub
  187.         End If
  188.     End If
  189.  
  190.     'Establish a connection with the server.
  191.     If blnConnect("root\cimv2" , _
  192.                    strUserName , _
  193.                    strPassword , _
  194.                    strServer   , _
  195.                    objService  ) Then
  196.         Call Wscript.Echo("")
  197.         Call Wscript.Echo("Please check the server name, " _
  198.                         & "credentials and WBEM Core.")
  199.         Exit Sub
  200.     End If
  201.  
  202.  
  203.     'Now executes the method.
  204.     If strServer = "" Then
  205.         strWBEMClass = "Win32_Process.Handle=" & intProcessId
  206.     Else
  207.         strWBEMClass = "\\" & strServer & "\root\cimv2:Win32_Process.Handle=" _
  208.                        & intProcessId
  209.     End If
  210.  
  211.     Set objInstance = objService.Get(strWBEMClass)
  212.     If blnErrorOccurred(" occurred in getting process " & strWBEMClass & ".") _
  213.                           Then Exit Sub
  214.  
  215.     intStatus = objInstance.Terminate
  216.  
  217.     If intStatus = 0 Then
  218.         strMessage = "Process " & intProcessId & " has been killed."
  219.     Else
  220.         strMessage = "Failed to kill process " & intProcessId & "."
  221.     End If
  222.  
  223.     WriteLine strMessage, objOutputFile
  224.  
  225.  
  226.     If IsObject(objOutputFile) Then
  227.         objOutputFile.Close
  228.         Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
  229.     End If
  230.  
  231. End Sub
  232.  
  233.  
  234.  
  235. '********************************************************************
  236. '*
  237. '* Function intParseCmdLine()
  238. '*
  239. '* Purpose: Parses the command line.
  240. '* Input:   
  241. '*
  242. '* Output:  strServer         a remote server ("" = local server")
  243. '*          strUserName       the current user's name
  244. '*          strPassword       the current user's password
  245. '*          strOutputFile     an output file name
  246. '*
  247. '********************************************************************
  248. Private Function intParseCmdLine( ByRef strServer,        _
  249.                                   ByRef strUserName,      _
  250.                                   ByRef strPassword,      _
  251.                                   ByRef strOutputFile,    _
  252.                                   ByRef strCommand,       _
  253.                                   ByRef intProcessID      )
  254.  
  255.     ON ERROR RESUME NEXT
  256.  
  257.     Dim strFlag
  258.     Dim intState, intArgIter
  259.     Dim objFileSystem
  260.  
  261.     If Wscript.Arguments.Count > 0 Then
  262.         strFlag = Wscript.arguments.Item(0)
  263.     End If
  264.  
  265.     'Check if the user is asking for help or is just confused
  266.     If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
  267.         OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _ 
  268.         OR (strFlag="h") Then
  269.         intParseCmdLine = CONST_SHOW_USAGE
  270.         Exit Function
  271.     End If
  272.  
  273.     'Retrieve the command line and set appropriate variables
  274.      intArgIter = 0
  275.     Do While intArgIter <= Wscript.arguments.Count - 1
  276.         Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
  277.   
  278.             Case "/s"
  279.                 If Not blnGetArg("Server", strServer, intArgIter) Then
  280.                     intParseCmdLine = CONST_ERROR
  281.                     Exit Function
  282.                 End If
  283.                 intArgIter = intArgIter + 1
  284.  
  285.             Case "/o"
  286.                 If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
  287.                     intParseCmdLine = CONST_ERROR
  288.                     Exit Function
  289.                 End If
  290.                 intArgIter = intArgIter + 1
  291.  
  292.             Case "/u"
  293.                 If Not blnGetArg("User Name", strUserName, intArgIter) Then
  294.                     intParseCmdLine = CONST_ERROR
  295.                     Exit Function
  296.                 End If
  297.                 intArgIter = intArgIter + 1
  298.  
  299.             Case "/w"
  300.                 If Not blnGetArg("User Password", strPassword, intArgIter) Then
  301.                     intParseCmdLine = CONST_ERROR
  302.                     Exit Function
  303.                 End If
  304.                 intArgIter = intArgIter + 1
  305.  
  306.             Case "/e"
  307.                 intPArseCMdLine = CONST_EXECUTE
  308.                 If Not blnGetArg("Command", strCommand, intArgIter) Then
  309.                     intParseCmdLine = CONST_ERROR
  310.                     Exit Function
  311.                 End If
  312.                 intArgIter = intArgIter + 1
  313.  
  314.             Case "/x"
  315.                 intPArseCMdLine = CONST_KILL
  316.                 If Not blnGetArg("ProcessID", intProcessID, intArgIter) Then
  317.                     intParseCmdLine = CONST_ERROR
  318.                     Exit Function
  319.                 End If
  320.                 intArgIter = intArgIter + 1
  321.  
  322.  
  323.             Case Else 'We shouldn't get here
  324.                 Call Wscript.Echo("Invalid or misplaced parameter: " _
  325.                    & Wscript.arguments.Item(intArgIter) & vbCRLF _
  326.                    & "Please check the input and try again," & vbCRLF _
  327.                    & "or invoke with '/?' for help with the syntax.")
  328.                 Wscript.Quit
  329.  
  330.         End Select
  331.  
  332.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  333.  
  334.  
  335.     If IsEmpty(intParseCmdLine) Then _
  336.         intParseCmdLine = CONST_ERROR
  337.  
  338. End Function
  339.  
  340.  
  341. '********************************************************************
  342. '*
  343. '* Sub ShowUsage()
  344. '*
  345. '* Purpose: Shows the correct usage to the user.
  346. '*
  347. '* Input:   None
  348. '*
  349. '* Output:  Help messages are displayed on screen.
  350. '*
  351. '********************************************************************
  352. Private Sub ShowUsage()
  353.  
  354.     Wscript.Echo ""
  355.     Wscript.Echo "Executes a command."
  356.     Wscript.Echo ""
  357.     Wscript.Echo "SYNTAX:"
  358.     Wscript.Echo "  Exec.vbs [/e <Command> | /x <ProcessID>]"
  359.     Wscript.Echo "           [/S <server>] [/U <username>]" _
  360.                 &" [/W <password>]"
  361.     Wscript.Echo "  [/O <outputfile>]"
  362.     Wscript.Echo ""
  363.     Wscript.Echo "PARAMETER SPECIFIERS:"
  364.     Wscript.Echo "   command       A valid command. " _
  365.                & "(The entire command string must"
  366.     Wscript.Echo "                 be enclosed in quotes if " _
  367.                & "it contains empty spaces.)"
  368.     Wscript.Echo "   ProcessID     The Number of a currently running Process."
  369.     Wscript.Echo "   server        A machine name."
  370.     Wscript.Echo "   username      The current user's name."
  371.     Wscript.Echo "   password      Password of the current user."
  372.     Wscript.Echo "   outputfile    The output file name."
  373.     Wscript.Echo ""
  374.     Wscript.Echo "EXAMPLE:"
  375.     Wscript.Echo "1.  cscript Exec.vbs /e notepad /s MyMachine2"
  376.     Wscript.Echo "    Starts notepad on MyMachine2."
  377.     Wscript.Echo "2.  cscript Exec.vbs /x 2112"
  378.     Wscript.Echo "    Kills process 2112 on the local machine."
  379.     Wscript.Echo ""
  380.     Wscript.Echo "Note:"
  381.     Wscript.Echo "    Use ps.vbs to obtain process ID numbers"
  382.     Wscript.Echo ""
  383.  
  384. End Sub
  385.  
  386. '********************************************************************
  387. '* General Routines
  388. '********************************************************************
  389.  
  390. '********************************************************************
  391. '*
  392. '* Function strPackString()
  393. '*
  394. '* Purpose: Attaches spaces to a string to increase the length to intWidth.
  395. '*
  396. '* Input:   strString   a string
  397. '*          intWidth    the intended length of the string
  398. '*          blnAfter    Should spaces be added after the string?
  399. '*          blnTruncate specifies whether to truncate the string or not if
  400. '*                      the string length is longer than intWidth
  401. '*
  402. '* Output:  strPackString is returned as the packed string.
  403. '*
  404. '********************************************************************
  405. Private Function strPackString( ByVal strString, _
  406.                                 ByVal intWidth,  _
  407.                                 ByVal blnAfter,  _
  408.                                 ByVal blnTruncate)
  409.  
  410.     ON ERROR RESUME NEXT
  411.  
  412.     intWidth      = CInt(intWidth)
  413.     blnAfter      = CBool(blnAfter)
  414.     blnTruncate   = CBool(blnTruncate)
  415.  
  416.     If Err.Number Then
  417.         Call Wscript.Echo ("Argument type is incorrect!")
  418.         Err.Clear
  419.         Wscript.Quit
  420.     End If
  421.  
  422.     If IsNull(strString) Then
  423.         strPackString = "null" & Space(intWidth-4)
  424.         Exit Function
  425.     End If
  426.  
  427.     strString = CStr(strString)
  428.     If Err.Number Then
  429.         Call Wscript.Echo ("Argument type is incorrect!")
  430.         Err.Clear
  431.         Wscript.Quit
  432.     End If
  433.  
  434.     If intWidth > Len(strString) Then
  435.         If blnAfter Then
  436.             strPackString = strString & Space(intWidth-Len(strString))
  437.         Else
  438.             strPackString = Space(intWidth-Len(strString)) & strString & " "
  439.         End If
  440.     Else
  441.         If blnTruncate Then
  442.             strPackString = Left(strString, intWidth-1) & " "
  443.         Else
  444.             strPackString = strString & " "
  445.         End If
  446.     End If
  447.  
  448. End Function
  449.  
  450. '********************************************************************
  451. '* 
  452. '*  Function blnGetArg()
  453. '*
  454. '*  Purpose: Helper to intParseCmdLine()
  455. '* 
  456. '*  Usage:
  457. '*
  458. '*     Case "/s" 
  459. '*       blnGetArg ("server name", strServer, intArgIter)
  460. '*
  461. '********************************************************************
  462. Private Function blnGetArg ( ByVal StrVarName,   _
  463.                              ByRef strVar,       _
  464.                              ByRef intArgIter) 
  465.  
  466.     blnGetArg = False 'failure, changed to True upon successful completion
  467.  
  468.     If Len(Wscript.Arguments(intArgIter)) > 2 then
  469.         If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
  470.             If Len(Wscript.Arguments(intArgIter)) > 3 then
  471.                 strVar = Right(Wscript.Arguments(intArgIter), _
  472.                          Len(Wscript.Arguments(intArgIter)) - 3)
  473.                 blnGetArg = True
  474.                 Exit Function
  475.             Else
  476.                 intArgIter = intArgIter + 1
  477.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  478.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  479.                     Call Wscript.Echo( "Please check the input and try again.")
  480.                     Exit Function
  481.                 End If
  482.  
  483.                 strVar = Wscript.Arguments.Item(intArgIter)
  484.                 If Err.Number Then
  485.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  486.                     Call Wscript.Echo( "Please check the input and try again.")
  487.                     Exit Function
  488.                 End If
  489.  
  490.                 If InStr(strVar, "/") Then
  491.                     Call Wscript.Echo( "Invalid " & StrVarName)
  492.                     Call Wscript.Echo( "Please check the input and try again.")
  493.                     Exit Function
  494.                 End If
  495.  
  496.                 blnGetArg = True 'success
  497.             End If
  498.         Else
  499.             strVar = Right(Wscript.Arguments(intArgIter), _
  500.                      Len(Wscript.Arguments(intArgIter)) - 2)
  501.             blnGetArg = True 'success
  502.             Exit Function
  503.         End If
  504.     Else
  505.         intArgIter = intArgIter + 1
  506.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  507.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  508.             Call Wscript.Echo( "Please check the input and try again.")
  509.             Exit Function
  510.         End If
  511.  
  512.         strVar = Wscript.Arguments.Item(intArgIter)
  513.         If Err.Number Then
  514.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  515.             Call Wscript.Echo( "Please check the input and try again.")
  516.             Exit Function
  517.         End If
  518.  
  519.         If InStr(strVar, "/") Then
  520.             Call Wscript.Echo( "Invalid " & StrVarName)
  521.             Call Wscript.Echo( "Please check the input and try again.")
  522.             Exit Function
  523.         End If
  524.         blnGetArg = True 'success
  525.     End If
  526. End Function
  527.  
  528. '********************************************************************
  529. '*
  530. '* Function blnConnect()
  531. '*
  532. '* Purpose: Connects to machine strServer.
  533. '*
  534. '* Input:   strServer       a machine name
  535. '*          strNameSpace    a namespace
  536. '*          strUserName     name of the current user
  537. '*          strPassword     password of the current user
  538. '*
  539. '* Output:  objService is returned  as a service object.
  540. '*          strServer is set to local host if left unspecified
  541. '*
  542. '********************************************************************
  543. Private Function blnConnect(ByVal strNameSpace, _
  544.                             ByVal strUserName,  _
  545.                             ByVal strPassword,  _
  546.                             ByRef strServer,    _
  547.                             ByRef objService)
  548.  
  549.     ON ERROR RESUME NEXT
  550.  
  551.     Dim objLocator, objWshNet
  552.  
  553.     blnConnect = False     'There is no error.
  554.  
  555.     'Create Locator object to connect to remote CIM object manager
  556.     Set objLocator = CreateObject("WbemScripting.SWbemLocator")
  557.     If Err.Number then
  558.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  559.                            " occurred in creating a locator object." )
  560.         If Err.Description <> "" Then
  561.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  562.         End If
  563.         Err.Clear
  564.         blnConnect = True     'An error occurred
  565.         Exit Function
  566.     End If
  567.  
  568.     'Connect to the namespace which is either local or remote
  569.     Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
  570.        strUserName, strPassword)
  571.     ObjService.Security_.impersonationlevel = 3
  572.     If Err.Number then
  573.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  574.                            " occurred in connecting to server " _
  575.            & strServer & ".")
  576.         If Err.Description <> "" Then
  577.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  578.         End If
  579.         Err.Clear
  580.         blnConnect = True     'An error occurred
  581.     End If
  582.  
  583.     'Get the current server's name if left unspecified
  584.     If IsEmpty(strServer) Then
  585.         Set objWshNet = CreateObject("Wscript.Network")
  586.     strServer     = objWshNet.ComputerName
  587.     End If
  588.  
  589. End Function
  590.  
  591. '********************************************************************
  592. '*
  593. '* Sub      VerifyHostIsCscript()
  594. '*
  595. '* Purpose: Determines which program is used to run this script.
  596. '*
  597. '* Input:   None
  598. '*
  599. '* Output:  If host is not cscript, then an error message is printed 
  600. '*          and the script is aborted.
  601. '*
  602. '********************************************************************
  603. Sub VerifyHostIsCscript()
  604.  
  605.     ON ERROR RESUME NEXT
  606.  
  607.     Dim strFullName, strCommand, i, j, intStatus
  608.  
  609.     strFullName = WScript.FullName
  610.  
  611.     If Err.Number then
  612.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
  613.         If Err.Description <> "" Then
  614.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  615.         End If
  616.         intStatus =  CONST_ERROR
  617.     End If
  618.  
  619.     i = InStr(1, strFullName, ".exe", 1)
  620.     If i = 0 Then
  621.         intStatus =  CONST_ERROR
  622.     Else
  623.         j = InStrRev(strFullName, "\", i, 1)
  624.         If j = 0 Then
  625.             intStatus =  CONST_ERROR
  626.         Else
  627.             strCommand = Mid(strFullName, j+1, i-j-1)
  628.             Select Case LCase(strCommand)
  629.                 Case "cscript"
  630.                     intStatus = CONST_CSCRIPT
  631.                 Case "wscript"
  632.                     intStatus = CONST_WSCRIPT
  633.                 Case Else       'should never happen
  634.                     Call Wscript.Echo( "An unexpected program was used to " _
  635.                                        & "run this script." )
  636.                     Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
  637.                                        & "be used to run this script." )
  638.                     intStatus = CONST_ERROR
  639.                 End Select
  640.         End If
  641.     End If
  642.  
  643.     If intStatus <> CONST_CSCRIPT Then
  644.         Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
  645.              "This can be achieved by" & vbCRLF & _
  646.              "1. Using ""CScript Exec.vbs arguments"" for Windows 95/98 or" _
  647.              & vbCRLF & "2. Changing the default Windows Scripting Host " _
  648.              & "setting to CScript" & vbCRLF & "    using ""CScript " _
  649.              & "//H:CScript //S"" and running the script using" & vbCRLF & _
  650.              "    ""Exec.vbs arguments"" for Windows NT/2000." )
  651.         WScript.Quit
  652.     End If
  653.  
  654. End Sub
  655.  
  656. '********************************************************************
  657. '*
  658. '* Sub WriteLine()
  659. '* Purpose: Writes a text line either to a file or on screen.
  660. '* Input:   strMessage  the string to print
  661. '*          objFile     an output file object
  662. '* Output:  strMessage is either displayed on screen or written to a file.
  663. '*
  664. '********************************************************************
  665. Sub WriteLine(ByVal strMessage, ByVal objFile)
  666.  
  667.     On Error Resume Next
  668.     If IsObject(objFile) then        'objFile should be a file object
  669.         objFile.WriteLine strMessage
  670.     Else
  671.         Call Wscript.Echo( strMessage )
  672.     End If
  673.  
  674. End Sub
  675.  
  676. '********************************************************************
  677. '* 
  678. '* Function blnErrorOccurred()
  679. '*
  680. '* Purpose: Reports error with a string saying what the error occurred in.
  681. '*
  682. '* Input:   strIn        string saying what the error occurred in.
  683. '*
  684. '* Output:  displayed on screen 
  685. '* 
  686. '********************************************************************
  687. Private Function blnErrorOccurred (ByVal strIn)
  688.  
  689.     If Err.Number Then
  690.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
  691.         If Err.Description <> "" Then
  692.             Call Wscript.Echo( "Error description: " & Err.Description)
  693.         End If
  694.         Err.Clear
  695.         blnErrorOccurred = True
  696.     Else
  697.         blnErrorOccurred = False
  698.     End If
  699.  
  700. End Function
  701.  
  702. '********************************************************************
  703. '* 
  704. '* Function blnOpenFile
  705. '*
  706. '* Purpose: Opens a file.
  707. '*
  708. '* Input:   strFileName        A string with the name of the file.
  709. '*
  710. '* Output:  Sets objOpenFile to a FileSystemObject and setis it to 
  711. '*            Nothing upon Failure.
  712. '* 
  713. '********************************************************************
  714. Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)
  715.  
  716.     ON ERROR RESUME NEXT
  717.  
  718.     Dim objFileSystem
  719.  
  720.     Set objFileSystem = Nothing
  721.  
  722.     If IsEmpty(strFileName) OR strFileName = "" Then
  723.         blnOpenFile = False
  724.         Set objOpenFile = Nothing
  725.         Exit Function
  726.     End If
  727.  
  728.     'Create a file object
  729.     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
  730.     If blnErrorOccurred("Could not create filesystem object.") Then
  731.         blnOpenFile = False
  732.         Set objOpenFile = Nothing
  733.         Exit Function
  734.     End If
  735.  
  736.     'Open the file for output
  737.     Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
  738.     If blnErrorOccurred("Could not open") Then
  739.         blnOpenFile = False
  740.         Set objOpenFile = Nothing
  741.         Exit Function
  742.     End If
  743.     blnOpenFile = True
  744.  
  745. End Function
  746.  
  747. '********************************************************************
  748. '*                                                                  *
  749. '*                           End of File                            *
  750. '*                                                                  *
  751. '********************************************************************