home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / ras.cab / service.vbs < prev    next >
Text File  |  1999-11-04  |  45KB  |  1,222 lines

  1. '********************************************************************
  2. '*
  3. '* File:           SERVICE.VBS
  4. '* Created:        March 1999
  5. '* Version:        1.0
  6. '*
  7. '* Main Function: Controls services on a machine.
  8. '*
  9. '*  1.  Service.vbs /L
  10. '*                 [/S <server>][/U <username>][/W <password>]
  11. '*                 [/O <outputfile>]
  12. '*
  13. '*  2.  Service.vbs /G | /X | /R | /D | /M <StartMode>
  14. '*                  /N <service>
  15. '*                 [/S <server>][/U <username>][/W <password>]
  16. '*                 [/O <outputfile>]
  17. '*
  18. '*  3.  Service.vbs /I /E <execname> /N <service> [/C <DisplayName>]
  19. '*                 [/S <server>][/U <username>][/W <password>]
  20. '*                 [/O <outputfile>]
  21. '*
  22. '* Copyright (C) 1999 Microsoft Corporation
  23. '*
  24. '********************************************************************
  25. OPTION EXPLICIT
  26.  
  27.     'Define constants
  28.  
  29.     CONST CONST_ERROR                   = 0
  30.     CONST CONST_WSCRIPT                 = 1
  31.     CONST CONST_CSCRIPT                 = 2
  32.     CONST CONST_SHOW_USAGE              = 3
  33.     CONST CONST_PROCEED                 = 4
  34.     CONST CONST_LIST                    = "LIST"
  35.     CONST CONST_START                   = "START"
  36.     CONST CONST_STOP                    = "STOP"
  37.     CONST CONST_INSTALL                 = "INSTALL"
  38.     CONST CONST_REMOVE                  = "REMOVE"
  39.     CONST CONST_DEPENDS                 = "DEPENDS"
  40.     CONST CONST_MODE                    = "MODE"
  41.  
  42.  
  43.     'Declare variables
  44.     Dim strOutputFile, intOpMode, i
  45.     Dim strServer, strUserName, strPassword
  46.     Dim strTaskCommand, strServiceName, strExecName
  47.     Dim strStartMode, strDisplayName
  48.  
  49.     'Make sure the host is csript, if not then abort
  50.     VerifyHostIsCscript()
  51.  
  52.     'Parse the command line
  53.  
  54.     intOpMode = intParseCmdLine( strServer      ,  _
  55.                                  strUserName    ,  _
  56.                                  strPassword    ,  _
  57.                                  strOutputFile  ,  _
  58.                                  strTaskCommand ,  _
  59.                                  strServiceName ,  _
  60.                                  strStartMode   ,  _
  61.                                  strDisplayName ,  _
  62.                                  strExecName       )
  63.  
  64.  
  65.  
  66.     Select Case intOpMode
  67.  
  68.         Case CONST_SHOW_USAGE
  69.             Call ShowUsage()
  70.  
  71.         Case CONST_PROCEED
  72.             Call Service(strTaskCommand, _
  73.                          strServiceName,    _ 
  74.                          strExecName,       _
  75.                             strDisplayName,    _
  76.                          strStartMode,      _
  77.                          strServer,         _
  78.                          strOutputFile,     _
  79.                          strUserName,       _
  80.                          strPassword        )
  81.                 
  82.  
  83.         Case CONST_ERROR
  84.             Wscript.Echo ("Error occurred in passing parameters.")
  85.  
  86.         Case Else                    'Default -- should never happen
  87.             call Print("Error occurred in passing parameters.")
  88.  
  89.     End Select
  90.  
  91. '********************************************************************
  92. '*
  93. '* Sub Service()
  94. '* Purpose: Controls services on a machine.
  95. '* Input:   
  96. '*          strTaskCommand      one of /list, /start, /stop /install /remove
  97. '*                              /dependents
  98. '*          strServiceName      name of the service
  99. '*          strExecName         name of executable for service install
  100. '*          strDisplayName      Display name for the service.
  101. '*          strStartMode        start mode of the service
  102. '*          strServer           a machine name
  103. '*          strOutputFile       an output file name
  104. '*          strUserName         the current user's name
  105. '*          strPassword         the current user's password
  106. '* Output:  Results are either printed on screen or saved in strOutputFile.
  107. '*
  108. '********************************************************************
  109. Private Sub Service(strTaskCommand, _ 
  110.                     strServiceName,    _
  111.                     strExecName,       _
  112.                     strDisplayName,    _
  113.                     strStartMode,      _
  114.                     strServer,           _
  115.                     strOutputFile,     _
  116.                     strUserName,       _
  117.                     strPassword)
  118.  
  119.     ON ERROR RESUME NEXT
  120.  
  121.     Dim objFileSystem, objOutputFile, objService, strQuery
  122.  
  123.     'Open a text file for output if the file is requested
  124.     If Not IsEmpty(strOutputFile) Then
  125.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  126.             Call Wscript.Echo ("Could not open an output file.")
  127.             Exit Sub
  128.         End If
  129.     End If
  130.  
  131.     'Establish a connection with the server.
  132.     If blnConnect("root\cimv2" , _
  133.                    strUserName , _
  134.                    strPassword , _
  135.                    strServer   , _
  136.                    objService  ) Then
  137.         Call Wscript.Echo("")
  138.         Call Wscript.Echo("Please check the server name, " _
  139.                         & "credentials and WBEM Core.")
  140.         Exit Sub
  141.     End If
  142.  
  143.     'Now execute the method.
  144.     Call ExecuteMethod(objService,        _
  145.                        objOutputFile,     _
  146.                        strTaskCommand, _
  147.                        strServiceName,    _
  148.                        strExecName,       _
  149.                        strDisplayName,    _
  150.                        strStartMode)
  151.  
  152.     If NOT IsEmpty(objOutputFile) Then
  153.         objOutputFile.Close
  154.         Wscript.Echo "Results are saved in file " & strOutputFile & "."
  155.     End If
  156.  
  157. End Sub
  158.  
  159. '********************************************************************
  160. '*
  161. '* Sub ExecMethod()
  162. '* Purpose: Executes a method.
  163. '* Input:   objService          a service object
  164. '*          objOutputFile       an output file object
  165. '*          strTaskCommand   one of /list, /start, /stop /install /delete
  166. '*          strServiceName      name of the service to be started or stopped
  167. '*          strExecName         name of executable for service install
  168. '*             strDisplayName,     Display name for the service.
  169. '*          strStartMode        start mode of the service
  170. '* Output:  Results are either printed on screen or saved in objOutputFile.
  171. '*
  172. '********************************************************************
  173. Private Sub ExecuteMethod(objService,        _
  174.                           objOutputFile,     _
  175.                           strTaskCommand, _
  176.                           strServiceName,    _
  177.                           strExecName,       _
  178.                           strDisplayName,    _
  179.                           strStartMode)
  180.  
  181.     ON ERROR RESUME NEXT
  182.  
  183.     Dim objEnumerator, objInstance, strMessage, intStatus, objReference
  184.     ReDim strName(0), strDisplayName(0), strState(0), intOrder(0)
  185.  
  186.     'Initialize local variables
  187.     strMessage        = ""
  188.     strName(0)        = ""
  189.     strDisplayName(0) = ""
  190.     strState(0)       = ""
  191.     intOrder(0)       = 0
  192.  
  193.     Select Case strTaskCommand
  194.         Case CONST_START
  195.             Set objInstance = objService.Get("Win32_Service='" &_
  196.                 strServiceName & "'")
  197.             If Err.Number Then
  198.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  199.                     " occurred in getting " & _
  200.                       "service " & strServiceName & ".")
  201.                 If Err.Description <> "" Then
  202.                     call Print( "Error description: " & Err.Description & ".")
  203.                 End If
  204.                 Err.Clear
  205.                 Exit Sub
  206.             End If
  207.             If objInstance is nothing Then
  208.                 Exit Sub
  209.             Else
  210.                 intStatus = objInstance.StartService()
  211.                 If intStatus = 0 Then
  212.                     strMessage = "Succeeded in starting service " & _
  213.                         strServiceName & "."
  214.                 Else
  215.                     strMessage = "Failed to start service " & _
  216.                         strServiceName & "."
  217.                 End If
  218.                 WriteLine strMessage, objOutputFile
  219.             End If
  220.  
  221.         Case CONST_STOP
  222.             Set objInstance = objService.Get("Win32_Service='" & _
  223.                  strServiceName&"'")
  224.             If Err.Number Then
  225.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  226.                     " occurred in getting " & _
  227.                       "service " & strServiceName & ".")
  228.                 Err.Clear
  229.                 Exit Sub
  230.             End If
  231.             If objInstance is nothing Then
  232.                 Exit Sub
  233.             Else
  234.                 intStatus = objInstance.StopService()
  235.                 If intStatus = 0 Then
  236.                     strMessage = "Succeeded in stopping service " & _
  237.                         strServiceName & "."
  238.                 Else
  239.                     strMessage = "Failed to stop service " & _
  240.                         strServiceName & "."
  241.                 End If
  242.                 WriteLine strMessage, objOutputFile
  243.             End If
  244.  
  245.         Case CONST_MODE
  246.  
  247.             Set objInstance = objService.Get("Win32_Service='" & _
  248.                 strServiceName & "'")
  249.             If Err.Number Then
  250.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  251.                     " occurred in getting " & _
  252.                     "service " & strServiceName & ".")
  253.                 Err.Clear
  254.                 Exit Sub
  255.             End If
  256.             If objInstance is nothing Then
  257.                 Exit Sub
  258.             Else
  259.                 intStatus = objInstance.ChangeStartMode(strStartMode)
  260.                 If intStatus = 0 Then
  261.                     strMessage = "Succeeded in changing start mode of the " _
  262.                         & "service " & strServiceName & "."
  263.                 Else
  264.                     strMessage = "Failed to change the start mode of the" _
  265.                         & " service " & strServiceName & "."
  266.                 End If
  267.                 WriteLine strMessage, objOutputFile
  268.             End If
  269.  
  270.         Case CONST_INSTALL
  271.             Set objInstance = objService.Get("Win32_Service")
  272.             If Err.Number Then
  273.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  274.                 " occurred in getting " & _
  275.                       "service " & strServiceName & ".")
  276.                 If Err.Description <> "" Then
  277.                     call Print( "Error description: " & Err.Description & ".")
  278.                 End If
  279.                 Err.Clear
  280.                 Exit Sub
  281.             End If
  282.             If objInstance is Nothing Then
  283.                 Exit Sub
  284.             Else
  285.  
  286.                 If IsEmpty(strDisplayName) then strDisplayName = strServiceName
  287.  
  288.                 intStatus = objInstance.Create(strServiceName, strDisplayName(0), strExecName)
  289.                 If intStatus = 0 Then
  290.                     strMessage = "Succeeded in creating service " & _
  291.                         strServiceName & "."
  292.                 Else
  293.                     strMessage = "Failed to create service " & _
  294.                         strServiceName & "."
  295.                 End If
  296.                 WriteLine strMessage, objOutputFile
  297.             End If
  298.  
  299.         Case CONST_REMOVE
  300.             Set objInstance = objService.Get("Win32_Service='" & _
  301.                 strServiceName & "'")
  302.             If Err.Number Then
  303.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  304.                     " occurred in getting " & _
  305.                     "service " & strServiceName & ".")
  306.                 If Err.Description <> "" Then
  307.                     call Print( "Error description: " & Err.Description & ".")
  308.                 End If
  309.                 Err.Clear
  310.                 Exit Sub
  311.             End If
  312.             If objInstance is Nothing Then
  313.                 Exit Sub
  314.             Else
  315.                 intStatus = objInstance.Delete()
  316.                 If intStatus = 0 Then
  317.                     strMessage = "Succeeded in deleting service " & _
  318.                         strServiceName & "."
  319.                 Else
  320.                     strMessage = "Failed to delete service " & _
  321.                         strServiceName & "."
  322.                 End If
  323.                 WriteLine strMessage, objOutputFile
  324.             End If
  325.  
  326.         Case CONST_DEPENDS
  327.             Set objInstance = objService.Get("Win32_Service='" & _
  328.                 strServiceName&"'")
  329.             If Err.Number Then
  330.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  331.                     " occurred in getting " & _
  332.                       "service " & strServiceName & ".")
  333.                 If Err.Description <> "" Then
  334.                     call Print( "Error description: " & Err.Description & ".")
  335.                 End If
  336.                 Err.Clear
  337.                 Exit Sub
  338.             End If
  339.             If objInstance is Nothing Then
  340.                 Exit Sub
  341.             Else
  342.                 Set objEnumerator = _
  343.                     objInstance.References_("Win32_DependentService")
  344.  
  345.                 If Err.Number Then
  346.                     call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  347.                         " occurred in getting " & _
  348.                         "reference set.")
  349.                     If Err.Description <> "" Then
  350.                         call Print( "Error description: " & _
  351.                             Err.Description & ".")
  352.                     End If
  353.                     Err.Clear
  354.                     Exit Sub
  355.                 End If
  356.             
  357.                 If objEnumerator.Count = 0 then
  358.                     WScript.Echo "No dependents listed"
  359.                 Else
  360.                     i = 0
  361.                     For Each objReference in objEnumerator
  362.                         If objInstance is nothing Then
  363.                             Exit Sub
  364.                         Else
  365.                             ReDim Preserve strName(i)
  366.                             ReDim strDisplayName(i), strState(i), intOrder(i)
  367.                             strName(i) = _
  368.                                 objService.Get(objReference.Dependent).Name
  369.                             strDisplayName(i) = _
  370.                                 objService.Get _
  371.                                     (objReference.Dependent).DisplayName
  372.                             strState(i) = _
  373.                                 objService.Get(objReference.Dependent).State
  374.                             intOrder(i) = i
  375.                             i = i + 1
  376.                         End If
  377.                         If Err.Number Then
  378.                             Err.Clear
  379.                         End If
  380.                     Next
  381.  
  382.                    'Display the header
  383.                     strMessage = Space(2) & strPackString("NAME", 20, 1, 1)
  384.                     strMessage = strMessage & strPackString("STATE", 10, 1, 1)
  385.                     strMessage = strMessage & strPackString _
  386.                         ("DISPLAY NAME", 15, 1, 0) & vbCRLF
  387.                     WriteLine strMessage, objOutputFile
  388.                     Call SortArray(strName, True, intOrder, 0)
  389.                     Call ReArrangeArray(strDisplayName, intOrder)
  390.                     Call ReArrangeArray(strState, intOrder)
  391.                     For i = 0 To UBound(strName)
  392.                         strMessage = Space(2) & _
  393.                             strPackString(strName(i), 20, 1, 1)
  394.                         strMessage = strMessage & _
  395.                             strPackString(strState(i), 10, 1, 1)
  396.                         strMessage = strMessage & _
  397.                             strPackString(strDisplayName(i), 15, 1, 0)
  398.                         WriteLine strMessage, objOutputFile
  399.                     Next
  400.  
  401.                 End If
  402.             End If
  403.  
  404.         Case CONST_LIST
  405.             Set objEnumerator = objService.ExecQuery ( _
  406.                 "Select Name,DisplayName,State From Win32_Service")
  407.             If Err.Number Then
  408.                 call Print( "Error 0x" & CStr(Hex(Err.Number)) & _
  409.                     " occurred during the query.")
  410.                 If Err.Description <> "" Then
  411.                     call Print( "Error description: " & Err.Description & ".")
  412.                 End If
  413.                 Err.Clear
  414.                 Exit Sub
  415.             End If
  416.             i = 0
  417.             For Each objInstance in objEnumerator
  418.                 If objInstance is nothing Then
  419.                     Exit Sub
  420.                 Else
  421.                     ReDim Preserve strName(i), strDisplayName(i)
  422.                     ReDim Preserve strState(i), intOrder(i)
  423.                     strName(i) = objInstance.Name
  424.                     strDisplayName(i) = objInstance.DisplayName
  425.                     strState(i) = objInstance.State
  426.                     intOrder(i) = i
  427.                     i = i + 1
  428.                 End If
  429.                 If Err.Number Then
  430.                     Err.Clear
  431.                 End If
  432.             Next
  433.  
  434.             If i > 0 Then
  435.                 'Display the header
  436.                 strMessage = Space(2) & strPackString("NAME", 20, 1, 1)
  437.                 strMessage = strMessage & strPackString("STATE", 10, 1, 1)
  438.                 strMessage = strMessage & strPackString("DISPLAY NAME", 15, 1, 0) & vbCRLF
  439.                 WriteLine strMessage, objOutputFile
  440.                 Call SortArray(strName, True, intOrder, 0)
  441.                 Call ReArrangeArray(strDisplayName, intOrder)
  442.                 Call ReArrangeArray(strState, intOrder)
  443.                 For i = 0 To UBound(strName)
  444.                     strMessage = Space(2) & strPackString(strName(i), 20, 1, 1)
  445.                     strMessage = strMessage & _
  446.                         strPackString(strState(i), 10, 1, 1)
  447.                     strMessage = strMessage & _
  448.                         Left(strPackString(strDisplayName(i), 15, 1, 0),47)
  449.                     WriteLine strMessage, objOutputFile
  450.                 Next
  451.             Else
  452.                 Wscript.Echo "Service not found!"
  453.             End If
  454.  
  455.     End Select
  456.  
  457. End Sub
  458.  
  459. '********************************************************************
  460. '*
  461. '* Function intParseCmdLine()
  462. '*
  463. '* Purpose: Parses the command line.
  464. '* Input:   
  465. '*
  466. '* Output:  strServer          a remote server ("" = local server")
  467. '*          strUserName        the current user's name
  468. '*          strPassword        the current user's password
  469. '*          strOutputFile      an output file name
  470. '*          strTaskCommand     one of /list, /start, /stop /install /remove
  471. '*                                    /dependents
  472. '*          strDriverName      name of the Service
  473. '*          strStartMode       start mode of the Service
  474. '*          strDisplayName     Display name for the Service
  475. '*          strExecName        The Full path of the executable
  476.  
  477. '*
  478. '********************************************************************
  479. Private Function intParseCmdLine( ByRef strServer      ,  _
  480.                                   ByRef strUserName    ,  _
  481.                                   ByRef strPassword    ,  _
  482.                                   ByRef strOutputFile  ,  _
  483.                                   ByRef strTaskCommand ,  _
  484.                                   ByRef strServiceName ,  _
  485.                                   ByRef strStartMode   ,  _
  486.                                   ByRef strDisplayName ,  _
  487.                                   ByRef strExecName       )
  488.  
  489.     ON ERROR RESUME NEXT
  490.  
  491.     Dim strFlag
  492.     Dim intState, intArgIter
  493.     Dim objFileSystem
  494.  
  495.     If Wscript.Arguments.Count > 0 Then
  496.         strFlag = Wscript.arguments.Item(0)
  497.     End If
  498.  
  499.     If IsEmpty(strFlag) Then                'No arguments have been received
  500.         intParseCmdLine = CONST_PROCEED
  501.         strTaskCommand = CONST_LIST
  502.         Exit Function
  503.     End If
  504.  
  505.     'Check if the user is asking for help or is just confused
  506.     If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
  507.         OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _ 
  508.         OR (strFlag="h") Then
  509.         intParseCmdLine = CONST_SHOW_USAGE
  510.         Exit Function
  511.     End If
  512.  
  513.     'Retrieve the command line and set appropriate variables
  514.      intArgIter = 0
  515.     Do While intArgIter <= Wscript.arguments.Count - 1
  516.         Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
  517.   
  518.             Case "/s"
  519.                 If Not blnGetArg("Server", strServer, intArgIter) Then
  520.                     intParseCmdLine = CONST_ERROR
  521.                     Exit Function
  522.                 End If
  523.                 intArgIter = intArgIter + 1
  524.  
  525.             Case "/o"
  526.                 If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
  527.                     intParseCmdLine = CONST_ERROR
  528.                     Exit Function
  529.                 End If
  530.                 intArgIter = intArgIter + 1
  531.  
  532.             Case "/u"
  533.                 If Not blnGetArg("User Name", strUserName, intArgIter) Then
  534.                     intParseCmdLine = CONST_ERROR
  535.                     Exit Function
  536.                 End If
  537.                 intArgIter = intArgIter + 1
  538.  
  539.             Case "/w"
  540.                 If Not blnGetArg("User Password", strPassword, intArgIter) Then
  541.                     intParseCmdLine = CONST_ERROR
  542.                     Exit Function
  543.                 End If
  544.                 intArgIter = intArgIter + 1
  545.  
  546.             Case "/l"
  547.                 intParseCmdLine = CONST_PROCEED
  548.                 strTaskCommand = CONST_LIST
  549.                 intArgIter = intArgIter + 1
  550.                
  551.             Case "/d"
  552.                 intParseCmdLine = CONST_PROCEED
  553.                 strTaskCommand = CONST_DEPENDS
  554.                 intArgIter = intArgIter + 1
  555.  
  556.             Case "/g"
  557.                 intParseCmdLine = CONST_PROCEED
  558.                 strTaskCommand = CONST_START
  559.                 intArgIter = intArgIter + 1
  560.               
  561.             Case "/x"
  562.                 intParseCmdLine = CONST_PROCEED
  563.                 strTaskCommand = CONST_STOP
  564.                 intArgIter = intArgIter + 1
  565.  
  566.             Case "/r"
  567.                 intParseCmdLine = CONST_PROCEED
  568.                 strTaskCommand = CONST_REMOVE
  569.                 intArgIter = intArgIter + 1 
  570.  
  571.             Case "/m"
  572.                 intParseCmdLine = CONST_PROCEED
  573.                 strTaskCommand = CONST_MODE
  574.                 If Not blnGetArg("Start Mode", strStartMode, intArgIter) Then
  575.                     intParseCmdLine = CONST_ERROR
  576.                     Exit Function
  577.                 End If
  578.                 intArgIter = intArgIter + 1
  579.             
  580.             Case "/c"
  581.                 If Not blnGetArg("Display Name", strDisplayName, intArgIter) Then
  582.                     intParseCmdLine = CONST_ERROR
  583.                     Exit Function
  584.                 End If
  585.                 intArgIter = intArgIter + 1
  586.  
  587.             Case "/n"
  588.                 If Not blnGetArg _
  589.                     ("Service Name", strServiceName, intArgIter) Then
  590.                     intParseCmdLine = CONST_ERROR
  591.                     Exit Function
  592.                 End If
  593.                 intArgIter = intArgIter + 1
  594.               
  595.             Case "/i"
  596.                 intParseCmdLine = CONST_PROCEED
  597.                 strTaskCommand = CONST_INSTALL
  598.                 intArgIter = intArgIter + 1
  599.  
  600.             Case "/e"
  601.                 If Not blnGetArg ("Exec Name", strExecName, intArgIter) Then
  602.                     intParseCmdLine = CONST_ERROR
  603.                     Exit Function
  604.                 End If
  605.                 intArgIter = intArgIter + 1
  606.  
  607.             Case Else 'We shouldn't get here
  608.                 Call Wscript.Echo("Invalid or misplaced parameter: " _
  609.                    & Wscript.arguments.Item(intArgIter) & vbCRLF _
  610.                    & "Please check the input and try again," & vbCRLF _
  611.                    & "or invoke with '/?' for help with the syntax.")
  612.                 Wscript.Quit
  613.  
  614.         End Select
  615.  
  616.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  617.  
  618.     If IsEmpty(strTaskCommand) Then 
  619.         intParseCmdLine = CONST_PROCEED
  620.         strTaskCommand = CONST_LIST
  621.         Exit Function
  622.     End If
  623.  
  624.     Select Case strTaskCommand
  625.         Case CONST_START
  626.             If IsEmpty(strServiceName) then
  627.                 intParseCmdLine = CONST_ERROR
  628.             End IF
  629.         Case CONST_DEPENDS
  630.             If IsEmpty(strServiceName) then
  631.                 intParseCmdLine = CONST_ERROR
  632.             End IF
  633.         Case CONST_STOP
  634.             If IsEmpty(strServiceName) then
  635.                 intParseCmdLine = CONST_ERROR
  636.             End IF
  637.         Case CONST_REMOVE
  638.             If IsEmpty(strServiceName) then
  639.                 intParseCmdLine = CONST_ERROR
  640.             End IF
  641.         Case CONST_MODE
  642.             If IsEmpty(strServiceName) then
  643.                 intParseCmdLine = CONST_ERROR
  644.             End IF
  645.         Case CONST_INSTALL
  646.             If IsEmpty(strServiceName) then
  647.                 intParseCmdLine = CONST_ERROR
  648.             End If
  649.             If IsEmpty(strExecName) then
  650.                 intParseCmdLine = CONST_ERROR
  651.             End IF
  652.     End Select
  653.  
  654. End Function
  655.  
  656. '********************************************************************
  657. '*
  658. '* Sub ShowUsage()
  659. '*
  660. '* Purpose: Shows the correct usage to the user.
  661. '*
  662. '* Input:   None
  663. '*
  664. '* Output:  Help messages are displayed on screen.
  665. '*
  666. '********************************************************************
  667. Private Sub ShowUsage()
  668.  
  669.     Wscript.Echo ""
  670.     Wscript.Echo "Controls services on a machine."
  671.     Wscript.Echo ""
  672.     Wscript.Echo "SYNTAX:"
  673.     Wscript.Echo "1.  Service.vbs /L"
  674.     Wscript.Echo "               [/S <server>][/U <username>][/W <password>]"
  675.     Wscript.Echo "               [/O <outputfile>]"
  676.     Wscript.Echo ""
  677.     Wscript.Echo "2.  Service.vbs /G | /X | /R | /D | /M <StartMode>"
  678.     Wscript.Echo "                /N <service>"
  679.     Wscript.Echo "               [/S <server>][/U <username>][/W <password>]"
  680.     Wscript.Echo "               [/O <outputfile>]"
  681.     Wscript.Echo ""
  682.     Wscript.Echo "3.  Service.vbs /I /E <execname> /N <service> " _
  683.                & "[/C <DisplayName>]"
  684.     Wscript.Echo "               [/S <server>][/U <username>][/W <password>]"
  685.     Wscript.Echo "               [/O <outputfile>]"
  686.     Wscript.Echo ""
  687.     Wscript.Echo "PARAMETER SPECIFIERS:"
  688.     Wscript.Echo "   /L            List all Services"
  689.     Wscript.Echo "   /D            List Service dependencies"
  690.     Wscript.Echo "   /G            Start a Service"
  691.     Wscript.Echo "   /X            Stop a Service"
  692.     Wscript.Echo "   /R            Remove a Service"
  693.     Wscript.Echo "   /M            Set the Service Mode"
  694.     Wscript.Echo "   /I            Install a service"
  695.     Wscript.Echo "   /E            The Full path and filename of the service"
  696.     Wscript.Echo "   StartMode     The Service Startup Setting."
  697.     Wscript.Echo "   Service       A Service Name"
  698.     Wscript.Echo "   DisplayName   The Service name that appears in the" _
  699.                & " listing/"
  700.     Wscript.Echo "   server        A machine name."
  701.     Wscript.Echo "   username      The current user's name."
  702.     Wscript.Echo "   password      Password of the current user."
  703.     Wscript.Echo "   outputfile    The output file name."
  704.     Wscript.Echo ""
  705.     Wscript.Echo "EXAMPLE:"
  706.     Wscript.Echo "1. cscript Service.vbs /L /S MyMachine2"
  707.     Wscript.Echo "   List installed services for the machine MyMachine2."
  708.     Wscript.Echo "2. cscript Service.vbs /X /N snmp"
  709.     Wscript.Echo "   Stops the snmp service on the current machine."
  710.     Wscript.Echo ""
  711.  
  712. End Sub
  713.  
  714. '********************************************************************
  715. '* General Routines
  716. '********************************************************************
  717.  
  718. '********************************************************************
  719. '*
  720. '* Sub SortArray()
  721. '* Purpose: Sorts an array and arrange another array accordingly.
  722. '* Input:   strArray    the array to be sorted
  723. '*          blnOrder    True for ascending and False for descending
  724. '*          strArray2   an array that has exactly the same number of 
  725. '*                      elements as strArray and will be reordered 
  726. '*                      together with strArray
  727. '*          blnCase     indicates whether the order is case sensitive
  728. '* Output:  The sorted arrays are returned in the original arrays.
  729. '* Note:    Repeating elements are not deleted.
  730. '*
  731. '********************************************************************
  732. Private Sub SortArray(strArray, blnOrder, strArray2, blnCase)
  733.  
  734.     ON ERROR RESUME NEXT
  735.  
  736.     Dim i, j, intUbound
  737.  
  738.     If IsArray(strArray) Then
  739.         intUbound = UBound(strArray)
  740.     Else
  741.         call Print( "Argument is not an array!")
  742.         Exit Sub
  743.     End If
  744.  
  745.     blnOrder = CBool(blnOrder)
  746.     blnCase = CBool(blnCase)
  747.     If Err.Number Then
  748.         call Print( "Argument is not a boolean!")
  749.         Exit Sub
  750.     End If
  751.  
  752.     i = 0
  753.     Do Until i > intUbound-1
  754.         j = i + 1
  755.         Do Until j > intUbound
  756.             If blnCase Then     'Case sensitive
  757.                 If (strArray(i) > strArray(j)) and blnOrder Then
  758.                     Swap strArray(i), strArray(j)   'swaps element i and j
  759.                     Swap strArray2(i), strArray2(j)
  760.                 ElseIf (strArray(i) < strArray(j)) and Not blnOrder Then
  761.                     Swap strArray(i), strArray(j)   'swaps element i and j
  762.                     Swap strArray2(i), strArray2(j)
  763.                 ElseIf strArray(i) = strArray(j) Then
  764.                     'Move element j to next to i
  765.                     If j > i + 1 Then
  766.                         Swap strArray(i+1), strArray(j)
  767.                         Swap strArray2(i+1), strArray2(j)
  768.                     End If
  769.                 End If
  770.             Else                 'Not case sensitive
  771.                 If (LCase(strArray(i)) > LCase(strArray(j))) and blnOrder Then
  772.                     Swap strArray(i), strArray(j)   'swaps element i and j
  773.                     Swap strArray2(i), strArray2(j)
  774.                 ElseIf (LCase(strArray(i)) < LCase(strArray(j))) _
  775.                         and Not blnOrder Then
  776.                     Swap strArray(i), strArray(j)   'swaps element i and j
  777.                     Swap strArray2(i), strArray2(j)
  778.                 ElseIf LCase(strArray(i)) = LCase(strArray(j)) Then
  779.                     'Move element j to next to i
  780.                     If j > i + 1 Then
  781.                         Swap strArray(i+1), strArray(j)
  782.                         Swap strArray2(i+1), strArray2(j)
  783.                     End If
  784.                 End If
  785.             End If
  786.             j = j + 1
  787.         Loop
  788.         i = i + 1
  789.     Loop
  790.  
  791. End Sub
  792.  
  793. '********************************************************************
  794. '*
  795. '* Sub Swap()
  796. '* Purpose: Exchanges values of two strings.
  797. '* Input:   strA    a string
  798. '*          strB    another string
  799. '* Output:  Values of strA and strB are exchanged.
  800. '*
  801. '********************************************************************
  802. Private Sub Swap(ByRef strA, ByRef strB)
  803.  
  804.     Dim strTemp
  805.  
  806.     strTemp = strA
  807.     strA = strB
  808.     strB = strTemp
  809.  
  810. End Sub
  811.  
  812. '********************************************************************
  813. '*
  814. '* Sub ReArrangeArray()
  815. '* Purpose: Rearranges one array according to order specified in another array.
  816. '* Input:   strArray    the array to be rearranged
  817. '*          intOrder    an integer array that specifies the order
  818. '* Output:  strArray is returned as rearranged
  819. '*
  820. '********************************************************************
  821. Private Sub ReArrangeArray(strArray, intOrder)
  822.  
  823.     ON ERROR RESUME NEXT
  824.  
  825.     Dim intUBound, i, strTempArray()
  826.  
  827.     If Not (IsArray(strArray) and IsArray(intOrder)) Then
  828.         call Print( "At least one of the arguments is not an array")
  829.         Exit Sub
  830.     End If
  831.  
  832.     intUBound = UBound(strArray)
  833.  
  834.     If intUBound <> UBound(intOrder) Then
  835.         call Print( "The upper bound of these two arrays do not match!")
  836.         Exit Sub
  837.     End If
  838.  
  839.     ReDim strTempArray(intUBound)
  840.  
  841.     For i = 0 To intUBound
  842.         strTempArray(i) = strArray(intOrder(i))
  843.         If Err.Number Then
  844.             call Print( "Error 0x" & CStr(Hex(Err.Number)) & " occurred in " _
  845.                       & "rearranging an array.")
  846.             If Err.Description <> "" Then
  847.                 call Print( "Error description: " & Err.Description & ".")
  848.             End If
  849.             Err.Clear
  850.             Exit Sub
  851.         End If
  852.     Next
  853.  
  854.     For i = 0 To intUBound
  855.         strArray(i) = strTempArray(i)
  856.     Next
  857.  
  858. End Sub
  859.  
  860. '********************************************************************
  861. '*
  862. '* Function strPackString()
  863. '*
  864. '* Purpose: Attaches spaces to a string to increase the length to intWidth.
  865. '*
  866. '* Input:   strString   a string
  867. '*          intWidth    the intended length of the string
  868. '*          blnAfter    Should spaces be added after the string?
  869. '*          blnTruncate specifies whether to truncate the string or not if
  870. '*                      the string length is longer than intWidth
  871. '*
  872. '* Output:  strPackString is returned as the packed string.
  873. '*
  874. '********************************************************************
  875. Private Function strPackString( ByVal strString, _
  876.                                 ByVal intWidth,  _
  877.                                 ByVal blnAfter,  _
  878.                                 ByVal blnTruncate)
  879.  
  880.     ON ERROR RESUME NEXT
  881.  
  882.     intWidth      = CInt(intWidth)
  883.     blnAfter      = CBool(blnAfter)
  884.     blnTruncate   = CBool(blnTruncate)
  885.  
  886.     If Err.Number Then
  887.         Call Wscript.Echo ("Argument type is incorrect!")
  888.         Err.Clear
  889.         Wscript.Quit
  890.     End If
  891.  
  892.     If IsNull(strString) Then
  893.         strPackString = "null" & Space(intWidth-4)
  894.         Exit Function
  895.     End If
  896.  
  897.     strString = CStr(strString)
  898.     If Err.Number Then
  899.         Call Wscript.Echo ("Argument type is incorrect!")
  900.         Err.Clear
  901.         Wscript.Quit
  902.     End If
  903.  
  904.     If intWidth > Len(strString) Then
  905.         If blnAfter Then
  906.             strPackString = strString & Space(intWidth-Len(strString))
  907.         Else
  908.             strPackString = Space(intWidth-Len(strString)) & strString & " "
  909.         End If
  910.     Else
  911.         If blnTruncate Then
  912.             strPackString = Left(strString, intWidth-1) & " "
  913.         Else
  914.             strPackString = strString & " "
  915.         End If
  916.     End If
  917.  
  918. End Function
  919.  
  920. '********************************************************************
  921. '* 
  922. '*  Function blnGetArg()
  923. '*
  924. '*  Purpose: Helper to intParseCmdLine()
  925. '* 
  926. '*  Usage:
  927. '*
  928. '*     Case "/s" 
  929. '*       blnGetArg ("server name", strServer, intArgIter)
  930. '*
  931. '********************************************************************
  932. Private Function blnGetArg ( ByVal StrVarName,   _
  933.                              ByRef strVar,       _
  934.                              ByRef intArgIter) 
  935.  
  936.     blnGetArg = False 'failure, changed to True upon successful completion
  937.  
  938.     If Len(Wscript.Arguments(intArgIter)) > 2 then
  939.         If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
  940.             If Len(Wscript.Arguments(intArgIter)) > 3 then
  941.                 strVar = Right(Wscript.Arguments(intArgIter), _
  942.                          Len(Wscript.Arguments(intArgIter)) - 3)
  943.                 blnGetArg = True
  944.                 Exit Function
  945.             Else
  946.                 intArgIter = intArgIter + 1
  947.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  948.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  949.                     Call Wscript.Echo( "Please check the input and try again.")
  950.                     Exit Function
  951.                 End If
  952.  
  953.                 strVar = Wscript.Arguments.Item(intArgIter)
  954.                 If Err.Number Then
  955.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  956.                     Call Wscript.Echo( "Please check the input and try again.")
  957.                     Exit Function
  958.                 End If
  959.  
  960.                 If InStr(strVar, "/") Then
  961.                     Call Wscript.Echo( "Invalid " & StrVarName)
  962.                     Call Wscript.Echo( "Please check the input and try again.")
  963.                     Exit Function
  964.                 End If
  965.  
  966.                 blnGetArg = True 'success
  967.             End If
  968.         Else
  969.             strVar = Right(Wscript.Arguments(intArgIter), _
  970.                      Len(Wscript.Arguments(intArgIter)) - 2)
  971.             blnGetArg = True 'success
  972.             Exit Function
  973.         End If
  974.     Else
  975.         intArgIter = intArgIter + 1
  976.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  977.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  978.             Call Wscript.Echo( "Please check the input and try again.")
  979.             Exit Function
  980.         End If
  981.  
  982.         strVar = Wscript.Arguments.Item(intArgIter)
  983.         If Err.Number Then
  984.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  985.             Call Wscript.Echo( "Please check the input and try again.")
  986.             Exit Function
  987.         End If
  988.  
  989.         If InStr(strVar, "/") Then
  990.             Call Wscript.Echo( "Invalid " & StrVarName)
  991.             Call Wscript.Echo( "Please check the input and try again.")
  992.             Exit Function
  993.         End If
  994.         blnGetArg = True 'success
  995.     End If
  996. End Function
  997.  
  998. '********************************************************************
  999. '*
  1000. '* Function blnConnect()
  1001. '*
  1002. '* Purpose: Connects to machine strServer.
  1003. '*
  1004. '* Input:   strServer       a machine name
  1005. '*          strNameSpace    a namespace
  1006. '*          strUserName     name of the current user
  1007. '*          strPassword     password of the current user
  1008. '*
  1009. '* Output:  objService is returned  as a service object.
  1010. '*          strServer is set to local host if left unspecified
  1011. '*
  1012. '********************************************************************
  1013. Private Function blnConnect(ByVal strNameSpace, _
  1014.                             ByVal strUserName,  _
  1015.                             ByVal strPassword,  _
  1016.                             ByRef strServer,    _
  1017.                             ByRef objService)
  1018.  
  1019.     ON ERROR RESUME NEXT
  1020.  
  1021.     Dim objLocator, objWshNet
  1022.  
  1023.     blnConnect = False     'There is no error.
  1024.  
  1025.     'Create Locator object to connect to remote CIM object manager
  1026.     Set objLocator = CreateObject("WbemScripting.SWbemLocator")
  1027.     If Err.Number then
  1028.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  1029.                            " occurred in creating a locator object." )
  1030.         If Err.Description <> "" Then
  1031.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  1032.         End If
  1033.         Err.Clear
  1034.         blnConnect = True     'An error occurred
  1035.         Exit Function
  1036.     End If
  1037.  
  1038.     'Connect to the namespace which is either local or remote
  1039.     Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
  1040.        strUserName, strPassword)
  1041.     ObjService.Security_.impersonationlevel = 3
  1042.     If Err.Number then
  1043.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  1044.                            " occurred in connecting to server " _
  1045.            & strServer & ".")
  1046.         If Err.Description <> "" Then
  1047.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  1048.         End If
  1049.         Err.Clear
  1050.         blnConnect = True     'An error occurred
  1051.     End If
  1052.  
  1053.     'Get the current server's name if left unspecified
  1054.     If IsEmpty(strServer) Then
  1055.         Set objWshNet = CreateObject("Wscript.Network")
  1056.     strServer     = objWshNet.ComputerName
  1057.     End If
  1058.  
  1059. End Function
  1060.  
  1061. '********************************************************************
  1062. '*
  1063. '* Sub      VerifyHostIsCscript()
  1064. '*
  1065. '* Purpose: Determines which program is used to run this script.
  1066. '*
  1067. '* Input:   None
  1068. '*
  1069. '* Output:  If host is not cscript, then an error message is printed 
  1070. '*          and the script is aborted.
  1071. '*
  1072. '********************************************************************
  1073. Sub VerifyHostIsCscript()
  1074.  
  1075.     ON ERROR RESUME NEXT
  1076.  
  1077.     Dim strFullName, strCommand, i, j, intStatus
  1078.  
  1079.     strFullName = WScript.FullName
  1080.  
  1081.     If Err.Number then
  1082.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
  1083.         If Err.Description <> "" Then
  1084.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  1085.         End If
  1086.         intStatus =  CONST_ERROR
  1087.     End If
  1088.  
  1089.     i = InStr(1, strFullName, ".exe", 1)
  1090.     If i = 0 Then
  1091.         intStatus =  CONST_ERROR
  1092.     Else
  1093.         j = InStrRev(strFullName, "\", i, 1)
  1094.         If j = 0 Then
  1095.             intStatus =  CONST_ERROR
  1096.         Else
  1097.             strCommand = Mid(strFullName, j+1, i-j-1)
  1098.             Select Case LCase(strCommand)
  1099.                 Case "cscript"
  1100.                     intStatus = CONST_CSCRIPT
  1101.                 Case "wscript"
  1102.                     intStatus = CONST_WSCRIPT
  1103.                 Case Else       'should never happen
  1104.                     Call Wscript.Echo( "An unexpected program was used to " _
  1105.                                        & "run this script." )
  1106.                     Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
  1107.                                        & "be used to run this script." )
  1108.                     intStatus = CONST_ERROR
  1109.                 End Select
  1110.         End If
  1111.     End If
  1112.  
  1113.     If intStatus <> CONST_CSCRIPT Then
  1114.         Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
  1115.              "This can be achieved by" & vbCRLF & _
  1116.              "1. Using ""CScript Service.vbs arguments"" for Windows 95/98 or" _
  1117.              & vbCRLF & "2. Changing the default Windows Scripting Host " _
  1118.              & "setting to CScript" & vbCRLF & "    using ""CScript " _
  1119.              & "//H:CScript //S"" and running the script using" & vbCRLF & _
  1120.              "    ""Service.vbs arguments"" for Windows NT/2000." )
  1121.         WScript.Quit
  1122.     End If
  1123.  
  1124. End Sub
  1125.  
  1126. '********************************************************************
  1127. '*
  1128. '* Sub WriteLine()
  1129. '* Purpose: Writes a text line either to a file or on screen.
  1130. '* Input:   strMessage  the string to print
  1131. '*          objFile     an output file object
  1132. '* Output:  strMessage is either displayed on screen or written to a file.
  1133. '*
  1134. '********************************************************************
  1135. Sub WriteLine(ByVal strMessage, ByVal objFile)
  1136.  
  1137.     On Error Resume Next
  1138.     If IsObject(objFile) then        'objFile should be a file object
  1139.         objFile.WriteLine strMessage
  1140.     Else
  1141.         Call Wscript.Echo( strMessage )
  1142.     End If
  1143.  
  1144. End Sub
  1145.  
  1146. '********************************************************************
  1147. '* 
  1148. '* Function blnErrorOccurred()
  1149. '*
  1150. '* Purpose: Reports error with a string saying what the error occurred in.
  1151. '*
  1152. '* Input:   strIn        string saying what the error occurred in.
  1153. '*
  1154. '* Output:  displayed on screen 
  1155. '* 
  1156. '********************************************************************
  1157. Private Function blnErrorOccurred (ByVal strIn)
  1158.  
  1159.     If Err.Number Then
  1160.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
  1161.         If Err.Description <> "" Then
  1162.             Call Wscript.Echo( "Error description: " & Err.Description)
  1163.         End If
  1164.         Err.Clear
  1165.         blnErrorOccurred = True
  1166.     Else
  1167.         blnErrorOccurred = False
  1168.     End If
  1169.  
  1170. End Function
  1171.  
  1172. '********************************************************************
  1173. '* 
  1174. '* Function blnOpenFile
  1175. '*
  1176. '* Purpose: Opens a file.
  1177. '*
  1178. '* Input:   strFileName        A string with the name of the file.
  1179. '*
  1180. '* Output:  Sets objOpenFile to a FileSystemObject and setis it to 
  1181. '*            Nothing upon Failure.
  1182. '* 
  1183. '********************************************************************
  1184. Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)
  1185.  
  1186.     ON ERROR RESUME NEXT
  1187.  
  1188.     Dim objFileSystem
  1189.  
  1190.     Set objFileSystem = Nothing
  1191.  
  1192.     If IsEmpty(strFileName) OR strFileName = "" Then
  1193.         blnOpenFile = False
  1194.         Set objOpenFile = Nothing
  1195.         Exit Function
  1196.     End If
  1197.  
  1198.     'Create a file object
  1199.     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
  1200.     If blnErrorOccurred("Could not create filesystem object.") Then
  1201.         blnOpenFile = False
  1202.         Set objOpenFile = Nothing
  1203.         Exit Function
  1204.     End If
  1205.  
  1206.     'Open the file for output
  1207.     Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
  1208.     If blnErrorOccurred("Could not open") Then
  1209.         blnOpenFile = False
  1210.         Set objOpenFile = Nothing
  1211.         Exit Function
  1212.     End If
  1213.     blnOpenFile = True
  1214.  
  1215. End Function
  1216.  
  1217. '********************************************************************
  1218. '*                                                                  *
  1219. '*                           End of File                            *
  1220. '*                                                                  *
  1221. '********************************************************************
  1222.