/build/static/layout/Breadcrumb_cap_w.png

KACE Product Support Question


How to force start the services

03/12/2015 1650 views
Hi,

I need some help. Does anyone have a code to force to start the services for those startup_type = service_auto_start and status is other than service_Running? 
If the status of the auto_start is not service_running, i need to force it to start. 

thanks.
Answer Summary:
0 Comments   [ + ] Show comments

Comments


Answer Chosen by the Author

0

I dug out some *really* ancient code from my collection. It's designed for use in an MSI Custom Action - I used to use it for gaining finer control over services in an installation scenario - but everything you need is there. 

'// Copyright (c) DeepNet Limited, Ian Northwood
'// Programming obfuscation a speciality

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
 'Call RecordErrorMgsBox(strErrorMsg) '// Use this error reporting sub when run as CScript/WScript-hosted VB Script
 Call RecordErrorMSI(strErrorMsg) '// Use this error reporting sub for MSI-hosted VB Script
End If

Set objFSO      = Nothing
Set objWSHShell     = Nothing

Sub RecordErrorMgsBox(ByVal strMsg)
 objWSHShell.LogEvent 1, strMsg
 'MsgBox strMsg
End Sub

Sub RecordErrorMSI(ByVal strMsg)
 Const msiMessageTypeFatalExit  = &H00000000  '// Premature termination, possibly fatal out of memory.
 Const msiMessageTypeError  = &H01000000  '// Formatted error message, [1] is message number in Error table.
 Const msiMessageTypeWarning  = &H02000000  '// Formatted warning message, [1] is message number in Error table.
 Const msiMessageTypeUser  = &H03000000  '// User request message, [1] is message number in Error table.
 Const msiMessageTypeInfo  = &H04000000  '// Informative message for log, not to be displayed.
 Const msiMessageTypeFilesInUse  = &H05000000  '// List of files in use that need to be replaced.
 Const msiMessageTypeResolveSource = &H06000000  '// Request to determine a valid source location.
 Const msiMessageTypeOutOfDiskSpace = &H07000000  '// Insufficient disk space message.
 Const msiMessageTypeActionStart  = &H08000000  '// Start of action,
        '//  [1] action name,
        '//  [2] description,
        '//  [3] template for ACTIONDATA messages.
 Const msiMessageTypeActionData  = &H09000000  '// Action data. Record fields correspond to the template of ACTIONSTART message.
 Const msiMessageTypeProgress  = &H0A000000  '// Progress bar information. See the description of record fields below.
 Const msiMessageTypeCommonData  = &H0B000000 '// To enable the Cancel button set [1] to 2 and [2] to 1.
         '// To disable the Cancel button set [1] to 2 and [2] to 0
 Dim objMSIRecord
 
 '// Make an entry in Event Log
 objWSHShell.LogEvent 1, strMsg

 '// Make an entry in MSI log
 Set objMSIRecord    = Session.Installer.CreateRecord(0)
 objMSIRecord.StringData(0)   = strMsg
 Session.Message msiMessageTypeError, objMSIRecord
 
 Set objMSIRecord    = Nothing
End Sub

'// =========================================================================================================
'//     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 03/12/2015 by: VBScab
Red Belt

All Answers

0
Its one line in powershell, there's enough examples in your favorite browser. Am I glad I moved away from VB.
Answered 03/12/2015 by: deliveryboy
Orange Senior Belt

  • One line you're not going to share with anyone? #Helpful
    • This will get you started: Get-WmiObject Win32_Service | Where-Object {$_.StartMode -eq 'Auto' -and $_.State -eq 'Stopped'} | Start-Service -ErrorAction SilentlyContinue

Don't be a Stranger!

Sign up today to participate, stay informed, earn points and establish a reputation for yourself!

Sign up! or login

Share

 
This website uses cookies. By continuing to use this site and/or clicking the "Accept" button you are providing consent Quest Software and its affiliates do NOT sell the Personal Data you provide to us either when you register on our websites or when you do business with us. For more information about our Privacy Policy and our data protection efforts, please visit GDPR-HQ