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:
Cancel
0 Comments   [ + ] Show Comments

Comments

Please log in to comment

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

Please log in to comment

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
Please log in to comment
Answer this question or Comment on this question for clarity

Share