Start, Stop, Pause and Get Status of Services

By | 2019-08-22

Using the Windows API, you can easily work with Windows services. This module makes it even easier, allowing you to query status, stop, start, and pause services, on the local machine or remote computers.

Option Explicit

'API Constants
Public Const SERVICES_ACTIVE_DATABASE = "ServicesActive"
' Service Control
Public Const SERVICE_CONTROL_STOP = &H1
Public Const SERVICE_CONTROL_PAUSE = &H2
' Service State - for CurrentState
Public Const SERVICE_STOPPED = &H1
Public Const SERVICE_START_PENDING = &H2
Public Const SERVICE_STOP_PENDING = &H3
Public Const SERVICE_RUNNING = &H4
Public Const SERVICE_CONTINUE_PENDING = &H5
Public Const SERVICE_PAUSE_PENDING = &H6
Public Const SERVICE_PAUSED = &H7
'Service Control Manager object specific access types
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SC_MANAGER_CONNECT = &H1
Public Const SC_MANAGER_CREATE_SERVICE = &H2
Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Public Const SC_MANAGER_LOCK = &H8
Public Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
Public Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
Public Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG)
'Service object specific access types
Public Const SERVICE_QUERY_CONFIG = &H1
Public Const SERVICE_CHANGE_CONFIG = &H2
Public Const SERVICE_QUERY_STATUS = &H4
Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8
Public Const SERVICE_START = &H10
Public Const SERVICE_STOP = &H20
Public Const SERVICE_PAUSE_CONTINUE = &H40
Public Const SERVICE_INTERROGATE = &H80
Public Const SERVICE_USER_DEFINED_CONTROL = &H100
Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL)

Type SERVICE_STATUS
   dwServiceType As Long
   dwCurrentState As Long
   dwControlsAccepted As Long
   dwWin32ExitCode As Long
   dwServiceSpecificExitCode As Long
   dwCheckPoint As Long
   dwWaitHint As Long
End Type

Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long
Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, lpServiceStatus As SERVICE_STATUS) As Long
Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As Long

Module
Public Function ServiceStatus(ComputerName As String, ServiceName As String) As String
   Dim ServiceStat As SERVICE_STATUS
   Dim hSManager As Long
   Dim hService As Long
   Dim hServiceStatus As Long

   ServiceStatus = ""
   hSManager = OpenSCManager(ComputerName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
   If hSManager <> 0 Then
      hService = OpenService(hSManager, ServiceName, SERVICE_ALL_ACCESS)
      If hService <> 0 Then
         hServiceStatus = QueryServiceStatus(hService, ServiceStat)
         If hServiceStatus <> 0 Then
            Select Case ServiceStat.dwCurrentState
            Case SERVICE_STOPPED
               ServiceStatus = "Stopped"
            Case SERVICE_START_PENDING
               ServiceStatus = "Start Pending"
            Case SERVICE_STOP_PENDING
               ServiceStatus = "Stop Pending"
            Case SERVICE_RUNNING
               ServiceStatus = "Running"
            Case SERVICE_CONTINUE_PENDING
               ServiceStatus = "Coninue Pending"
            Case SERVICE_PAUSE_PENDING
               ServiceStatus = "Pause Pending"
            Case SERVICE_PAUSED
               ServiceStatus = "Paused"
            End Select
         End If
         CloseServiceHandle hService
      End If
      CloseServiceHandle hSManager
   End If
End Function


Public Sub ServicePause(ComputerName As String, ServiceName As String)
   Dim ServiceStatus As SERVICE_STATUS
   Dim hSManager As Long
   Dim hService As Long
   Dim res As Long

   hSManager = OpenSCManager(ComputerName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
   If hSManager <> 0 Then
      hService = OpenService(hSManager, ServiceName, SERVICE_ALL_ACCESS)
      If hService <> 0 Then
         res = ControlService(hService, SERVICE_CONTROL_PAUSE, ServiceStatus)
         CloseServiceHandle hService
      End If
      CloseServiceHandle hSManager
   End If
End Sub

Public Sub ServiceStart(ComputerName As String, ServiceName As String)
   Dim ServiceStatus As SERVICE_STATUS
   Dim hSManager As Long
   Dim hService As Long
   Dim res As Long

   hSManager = OpenSCManager(ComputerName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
   If hSManager <> 0 Then
      hService = OpenService(hSManager, ServiceName, SERVICE_ALL_ACCESS)
      If hService <> 0 Then
         res = StartService(hService, 0, 0)
         CloseServiceHandle hService
      End If
      CloseServiceHandle hSManager
   End If
End Sub

Public Sub ServiceStop(ComputerName As String, ServiceName As String)
   Dim ServiceStatus As SERVICE_STATUS
   Dim hSManager As Long
   Dim hService As Long
   Dim res As Long

   hSManager = OpenSCManager(ComputerName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
   If hSManager <> 0 Then
      hService = OpenService(hSManager, ServiceName, SERVICE_ALL_ACCESS)
      If hService <> 0 Then
         res = ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus)
         CloseServiceHandle hService
      End If
      CloseServiceHandle hSManager
   End If
End Sub

Usage

The first parameter is the remote computer name, if it is “” the computer is the local computer, the second is the service name.

Private Sub Command1_Click()
   ServiceStop "", "Schedule"
End Sub

Private Sub Command2_Click()
   ServiceStart "", "Schedule"
End Sub

Private Sub Command3_Click()
   ServicePause "", "Schedule"
End Sub

Private Sub Command4_Click()
   MsgBox ServiceStatus("", "Schedule")
End Sub

Author: dwirch

Derek Wirch is a seasoned IT professional with an impressive career dating back to 1986. He brings a wealth of knowledge and hands-on experience that is invaluable to those embarking on their journey in the tech industry.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.