Hi, my operating system is Windows 7 64 bit.   Is it possible to make a script that will start a program and then while program is running to wait for a service to start and then stop it?    Example start MS Word and then stop a loaded service.   I tried with a bat file but the problem is it stops after starting the program and will not proceed to the next line to stop a service until the program exits.   I was thinking maybe its possible with vbs.   Thanks in advance for your help!
Answer Summary:
Cancel
0 Comments   [ + ] Show Comments

Comments

Please log in to comment

Answer Chosen by the Author

1

Rather than calling winword.exe directly, use START instead. You'll get control passed back immediately.

START [path_to_winword.exe]winword.exe

VBScript will give you much more control. Here's some VBS code I've used before.

Option Explicit

Dim blnReturn
Dim objWSHShell
Dim objFSO
Dim strServiceName
Dim strServiceDisplayName
Dim strControlWord
Dim intWait
Dim strErrorMsg

Set objWSHShell     = CreateObject("Wscript.Shell")
Set objFSO      = CreateObject("Scripting.FileSystemObject")

strServiceName     = ""    '// Process (EXE) name
strServiceDisplayName    = "User Authentication Manager" '// Display name as it appears in 'NET START'
strControlWord     = "START"   '// Operation to perform. Can be:
          '//  START
          '//  STOP
          '//  PAUSE
          '//  CONTINUE
intWait      = 5    '// Number of seconds to wait before deciding operation
          '// has failed

'blnReturn = ControlServiceADSI(".", strServiceName, strServiceDisplayName, strControlWord, intWait, strErrorMsg)
blnReturn = ControlServiceWMI(".", strServiceName, strServiceDisplayName, strControlWord, intWait, strErrorMsg)

If Not blnReturn Then
 '// Use your favoured error reporting route here
End If

Set objFSO      = Nothing
Set objWSHShell     = Nothing

'// =========================================================================================================
'//     Name: ControlServiceADSI
'//  Purpose: Controls services using ADSI
'//    Input: strComputer  - String  - the computer on which we want to control the service. Null means local machine
'//      strService  - String  - the name of the service. If blank, the function will use strDisplayName
'//      strDisplayName  - String  - the display name of the service. If blank, the function will use strService
'//      strOperation  - String  - the operation for the service: START, STOP, PAUSE or CONTINUE
'//      intWaitTime  - Integer  - nbr of times to loop (effectively, the nbr of seconds to wait
'//         for 'strOperation' to complete
'//   Output: strError  - String - contains error text, if operation fails
'//  Returns: True/False
'// =========================================================================================================
Function ControlServiceADSI(ByVal strComputer, ByVal strService, ByVal strDisplayName, ByVal strOperation, ByVal intWaitTime, ByRef strError)

 '// Define ADSI status constants
 Const ADS_SERVICE_STOPPED           = 1
 Const ADS_SERVICE_START_PENDING     = 2
 Const ADS_SERVICE_STOP_PENDING      = 3
 Const ADS_SERVICE_RUNNING           = 4
 Const ADS_SERVICE_CONTINUE_PENDING  = 5
 Const ADS_SERVICE_PAUSE_PENDING     = 6
 Const ADS_SERVICE_PAUSED            = 7
 Const ADS_SERVICE_ERROR             = 8

 '// Define string constants for service methods
 Const START_SERVICE       = "START"
 Const STOP_SERVICE        = "STOP"
 Const PAUSE_SERVICE       = "PAUSE"
 Const CONTINUE_SERVICE    = "CONTINUE"

 Dim strMsgText
 Dim objComputer
 Dim objService
 Dim intCounter
 
 ControlServiceADSI   = False

 On Error Resume Next
 
 If Len(strService) = 0 And Len(strDisplayName) = 0 Then
  strMsgText = ""
  strMsgText = strMsgText & "Neither the service name and service display name were specified."
  Exit Function
 End If
 
 '// Get ADSI objects and initial variables
 Set objComputer = GetObject("WinNT://" & strComputer & ",computer")
 Set objService  = objComputer.GetObject("Service", strService)

 '// Determine the operation and carry it out
 With objService
  Select Case (strOperation)
   Case START_SERVICE     
    If .Status = ADS_SERVICE_STOPPED Then
     .Start

     Do
      If .Status = ADS_SERVICE_RUNNING Then
       Exit Do
      End If
      Call Sleep(1)
      intCounter = intCounter + 1
     Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
    End If

   Case STOP_SERVICE
    If .Status = ADS_SERVICE_RUNNING Or .Status = ADS_SERVICE_PAUSED Then
     .Stop

     Do
      If .Status = ADS_SERVICE_STOPPED Then
       Exit Do
      End If
      Call Sleep(1)
      intCounter = intCounter + 1
     Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
    End If

   Case PAUSE_SERVICE
    If .Status = ADS_SERVICE_RUNNING Then
     .Pause

     Do
      If .Status = ADS_SERVICE_PAUSED Then
       Exit Do
      End If
      Call Sleep(1)
      intCounter = intCounter + 1
     Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
    End If

   Case CONTINUE_SERVICE
    If .Status = ADS_SERVICE_PAUSED Then
     .Continue
     Do
      If .Status = ADS_SERVICE_RUNNING Then
       Exit Do
      End If
      Call Sleep(1)
      intCounter = intCounter + 1
     Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
    End If
  End Select
 End With

 If Err.Number = 0 Then
  ControlServiceADSI = True
 Else
  strMsgText = ""
  strMsgText = strMsgText & "Error " & Err.Number & " occured."
  
  If Len(Err.Description) > 0 Then
   strMsgText = strMsgText & Err.Description
  End If
  
  strError = strMsgText
 End If
 
 On Error Goto 0

End Function

'// =========================================================================================================
'//     Name: ControlServiceWMI
'//  Purpose: Controls services using WMI
'//    Input: strComputer  - String  - the computer on which we want to control the service. Null means local machine
'//      strService  - String  - the name of the service. If blank, the function will use strDisplayName
'//      strDisplayName  - String  - the display name of the service. If blank, the function will use strService
'//      strOperation  - String  - the operation for the service: START, STOP, PAUSE or CONTINUE
'//      intWaitTime  - Integer  - nbr of times to loop (effectively, the nbr of seconds to wait
'//         for 'strOperation' to complete
'//   Output: strError  - String - contains error text, if operation fails
'//  Returns: True/False
'// =========================================================================================================
Function ControlServiceWMI(ByVal strComputer, ByVal strService, ByVal strDisplayName, ByVal strOperation, ByVal intWaitTime, ByRef strError)

 '// Define WMI *state* constants  these are for the 'State' property
 Const WMI_SERVICE_STOPPED            = "Stopped"
 Const WMI_SERVICE_STARTED   = "Running"
 Const WMI_SERVICE_START_PENDING      = "Start Pending"
 Const WMI_SERVICE_STOP_PENDING       = "Stop Pending"
 Const WMI_SERVICE_RUNNING            = "Running"
 Const WMI_SERVICE_CONTINUE_PENDING   = "Continue Pending"
 Const WMI_SERVICE_PAUSE_PENDING      = "Pause Pending"
 Const WMI_SERVICE_PAUSED             = "Paused"
 Const WMI_SERVICE_ERROR              = "Unknown"

 '// Define WMI *status* constants  these are for the 'Status' property
 Const WMI_SERVICE_OK       = "OK"
 Const WMI_SERVICE_DEGRADED        = "Degraded"
 Const WMI_SERVICE_UNKNOWN            = "Unknown"
 Const WMI_SERVICE_PRED_FAIL    = "Pred Fail"
 Const WMI_SERVICE_STARTING            = "Starting"
 Const WMI_SERVICE_STOPPING            = "Stopping"
 Const WMI_SERVICE_SERVICE             = "Service" '// ?

 '// Define string constants for service methods
 Const START_SERVICE        = "START"
 Const STOP_SERVICE         = "STOP"
 Const PAUSE_SERVICE        = "PAUSE"
 Const CONTINUE_SERVICE     = "CONTINUE"
 Const SET_AUTOMATIC     = "AUTOMATIC"
 Const SET_MANUAL     = "MANUAL"
 Const SET_DISABLED     = "DISABLED"

 '// Win32_Service Method Return Value Table
 Const WMI_Success     = 0
 Const WMI_NotSupported     = 1
 Const WMI_AccessDenied     = 2
 Const WMI_DependentServicesRunning   = 3
 Const WMI_InvalidServiceControl   = 4
 Const WMI_ServiceCannotAcceptControl   = 5
 Const WMI_ServiceNotActive    = 6
 Const WMI_ServiceRequestTimeout   = 7
 Const WMI_UnknownFailure    = 8
 Const WMI_PathNotFound     = 9
 Const WMI_ServiceAlreadyRunning   = 10
 Const WMI_ServiceDatabaseLocked   = 11
 Const WMI_ServiceDependencyDeleted   = 12
 Const WMI_ServiceDependencyFailure   = 13
 Const WMI_ServiceDisabled    = 14
 Const WMI_ServiceLogonFailure    = 15
 Const WMI_ServiceMarkedForDeletion   = 16
 Const WMI_ServiceNoThread    = 17
 Const WMI_StatusCircularDependency   = 18
 Const WMI_StatusDuplicateName    = 19
 Const WMI_StatusInvalidName    = 20
 Const WMI_StatusInvalidParameter   = 21
 Const WMI_StatusInvalidServiceAccount   = 22
 Const WMI_StatusServiceExists    = 23
 Const WMI_ServiceAlreadyPaused    = 24

 '// Build an array of the possible return values
 Dim strWMI_ReturnErrors
 Dim arrWMI_ReturnErrors
 
 strWMI_ReturnErrors    = ""
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Success,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Not Supported,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Access Denied,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Dependent Services Running,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Invalid Service Control,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Cannot Accept Control,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Not Active,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Request Timeout,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Unknown Failure,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Path Not Found,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Already Running,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Database Locked,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Dependency Deleted,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Dependency Failure,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Disabled,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Logon Failure,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Marked For Deletion,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service No Thread,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Circular Dependency,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Duplicate Name,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Invalid Name,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Invalid Parameter,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Invalid Service Account,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Status Service Exists,"
 strWMI_ReturnErrors    = strWMI_ReturnErrors & "Service Already Paused"

 '// Just in case you left the trailing comma in place...
 If Left(strWMI_ReturnErrors, 1) = "," Then
  strWMI_ReturnErrors = Left(strWMI_ReturnErrors, Len(strWMI_ReturnErrors) - 1)
 End If
 
 arrWMI_ReturnErrors    = Split(strWMI_ReturnErrors, ",")
 
 Dim strQuery
 Dim objComputer
 Dim objServiceList
 Dim objService
 Dim intCounter
 Dim blnServiceReturn
 
 ControlServiceWMI   = False

 If Len(strService) = 0 And Len(strDisplayName) = 0 Then
  strMsgText    = ""
  strMsgText    = strMsgText & "Neither the service name or service display name were specified."
  Exit Function
 End If
 
 On Error Resume Next

 '// Get WMI objects and initial variables
 'Set objComputer    = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 Set objComputer    = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

 If Err.Number = 0 Then
  '// Only interested in controllable services (i.e. not system services, drivers, etc)
  '// (well, we would be if ANY service set its 'AcceptStop' flag...)
  strQuery   = ""
  strQuery   = strQuery & "Select * From Win32_Service"
  strQuery   = strQuery & " Where "
  
  If Len(strService) > 0 Then
   strQuery  = strQuery & "Name = '" & strService & "'"
   If Len(strDisplayName) > 0 Then
    strQuery = strQuery & " And "
    strQuery = strQuery & "DisplayName = '" & strDisplayName & "'"
   End If
  Else
   strQuery  = strQuery & "DisplayName = '" & strDisplayName & "'"
  End If
   
  'strQuery   = strQuery & " And "
  'strQuery   = strQuery & "AcceptStop = True"

  Set objServiceList   = objComputer.ExecQuery (strQuery)

  If Err.Number = 0 Then
   If objServiceList.Count > 0 Then
    For Each objService in objServiceList
     '// Determine the operation and carry it out
     With objService
      Select Case (strOperation)
       Case SET_AUTOMATIC
        If (.StartMode <> SET_AUTOMATIC) Then
         Err.Number = .ChangeStartMode("Automatic")
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_STARTED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case SET_MANUAL
        If (.StartMode <> SET_MANUAL) Then
         Err.Number = .ChangeStartMode("Manual")
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_STARTED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case SET_DISABLED
        If (.StartMode <> SET_DISABLED) Then
         Err.Number = .ChangeStartMode("Disabled")
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_STARTED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case START_SERVICE     
        If (.State = WMI_SERVICE_STOPPED) Then
         Err.Number = .StartService()
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_STARTED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case STOP_SERVICE
        If (.State = WMI_SERVICE_RUNNING) Or (.State = WMI_SERVICE_PAUSED) Then
         Err.Number = .StopService()
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_STOPPED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case PAUSE_SERVICE
        If (.State = WMI_SERVICE_RUNNING) Then
         Err.Number = .PauseService()
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_PAUSED Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If

       Case CONTINUE_SERVICE
        If (.State = WMI_SERVICE_PAUSED) Then
         Err.Number = .ContinueService()
         If Err.Number <> 0 Then
          Do
           If .State = WMI_SERVICE_RUNNING Then
            Exit Do
           End If
           Call Sleep(1)
           intCounter = intCounter + 1
          Loop Until intCounter = intWaitTime '// We're only going to wait intWaitTime seconds
         End If
        End If
      End Select
     End With
    Next
   Else
    With Err
     .Description = "The service name specified "
     .Raise 999
     
     If Len(strService) > 0 Then
      If Len(strDisplayName) > 0 Then
       .Description = .Description & "'" & strDisplayName & "'"
      End If
     Else
      .Description = .Description & "=" & strService & "="
     End If

     .Description = .Description & " does not exist."
     .Source  = "ControlServiceWMI"
    End With
   End If
  End If
 End If
 
 If Err.Number = 0 Then
  ControlServiceWMI = True
 Else
  '// Loop through the error array and, when you hit what Err.Number is,
  '// drop out and set the appropriate error text
  For intCounter = 0 To UBound(arrWMI_ReturnErrors)
   If Err.Number = intCounter Then
    Err.Description = arrWMI_ReturnErrors(intCounter)
   End If
  Next
  
  strMsgText = ""
  strMsgText = strMsgText & "Error " & Err.Number & " occured."
  
  If Len(Err.Description) > 0 Then
   strMsgText = strMsgText & Err.Description
  End If
  
  strError = strMsgText
 End If

 On Error Goto 0

End Function

Sub Sleep(ByVal intDelayInSecs)
 '// Sleep is here because, of course, one can't use WScript.Sleep in embedded VBS CAs
 Dim datStart
 Dim blnCompleted
 
 datStart     = Now()
 blnCompleted     = False
 
 While Not blnCompleted
  If DateDiff("s", datStart, Now()) >= CInt(intDelayInSecs) Then
   blnCompleted   = True
  End If
 Wend
End Sub

Answered 04/25/2016 by: VBScab
Red Belt

Please log in to comment

Answers

0
wow, thank you,  impressive coding I'm sure would work but it is way beyond me. I do not know vbs and not even sure where or how I would enter the service name.   Also i would like the script to start Word first and then while Word still open to kill a particular service. 
I tried using START in the bat file but still will not work, the bat file will not proceed to ending the service while Word is still running.

I have 2 separate scripts - one to start the program, ie Word  and another to end the service but how would I combine them to just one script that will load the program and then proceed to kill a particular service.

1.  to start program
Dim objShell
Set objShell = WScript.CreateObject( "WScript.Shell" )
objShell.Run("""C:\Program Files (x86)\Microsoft Office\Office14\MSPUB.EXE""")
Set objShell = Nothing

2. to end a service
strServiceName = " name of service"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='" & strServiceName & "'")
For Each objService in colListOfServices
objService.StopService()
Next
Answered 04/25/2016 by: jenn92
White Belt

Please log in to comment
Answer this question or Comment on this question for clarity