有的系统服务启动后是不可人工令其停止的,比如“Event Log”,在“服务”中显示其详细信息时“停止”按钮是不可用的。那么如何知道某个服务可不可以用
ControlService hService, SERVICE_CONTROL_STOP, ServiceStatus
来将它停止呢?

解决方案 »

  1.   

    使用API
    Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal strMachineName As String, ByVal strDBName As String, ByVal lAccessReq As Long) As Long
    Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal strServiceName As String, ByVal lAccessReq As Long) As Long
    Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal lNumServiceArgs As Long, ByVal strArgs As String) As Boolean
    Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal lControlCode As Long, lpServiceStatus As SERVICE_STATUS) As Boolean
    Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hHandle As Long) As BooleanPublic 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 TypePublic 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 = &H1FF
    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 = &H40
    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
    Public Const SERVICE_CONTROL_STOP = &H1
    Public Const SERVICE_CONTROL_PAUSE = &H2
    Public Const SERVICE_CONTROL_CONTINUE = &H3
    Public Const SERVICE_CONTROL_INTERROGATE = &H4
    Public Const SERVICE_CONTROL_SHUTDOWN = &H5
    Public Const SERVICE_CONTROL_PARAMCHANGE = &H6
    Public Const SERVICE_CONTROL_NETBINDADD = &H7
    Public Const SERVICE_CONTROL_NETBINDREMOVE = &H8
    Public Const SERVICE_CONTROL_NETBINDENABLE = &H9
    Public Const SERVICE_CONTROL_NETBINDDISABLE = &HA
    '查询服务状态
    Public Function QuerySvc(strServiceName As String) As SERVICE_STATUS
    Dim retCode As Long, scHandle As Long, svcHandle As Long, svcStatus As SERVICE_STATUSscHandle = OpenSCManager(vbNullString, vbNullString, &H4)
    svcHandle = OpenService(scHandle, strServiceName, SERVICE_ALL_ACCESS)
    retCode = ControlService(svcHandle, SERVICE_QUERY_STATUS, QuerySvc)
    retCode = CloseServiceHandle(svcHandle)
    retCode = CloseServiceHandle(scHandle)'开始服务
    Public Function StartSvc(strServiceName As String) As BooleanDim retCode As Long, scHandle As Long, svcHandle As LongscHandle = OpenSCManager(vbNullString, vbNullString, &H4)
    svcHandle = OpenService(scHandle, strServiceName, SERVICE_ALL_ACCESS)
    StartSvc = StartService(svcHandle, 0&, 0&)
    retCode = CloseServiceHandle(svcHandle)
    retCode = CloseServiceHandle(scHandle)End Function
    '停止服务
    Public Function StopSvc(strServiceName As String) As BooleanDim retCode As Long, scHandle As Long, svcHandle As Long, svcStatus As SERVICE_STATUSscHandle = OpenSCManager(vbNullString, vbNullString, &H4)
    svcHandle = OpenService(scHandle, strServiceName, SERVICE_ALL_ACCESS)
    StopSvc = ControlService(svcHandle, SERVICE_CONTROL_STOP, svcStatus)
    retCode = CloseServiceHandle(svcHandle)
    retCode = CloseServiceHandle(scHandle)End Function
      

  2.   

    用wmi的win32_service类的acceptstop属性可以知道服务是否能停止。