启动和开启系统服务全家福

‘API
Option Explicit

Private Type SERVICE_STATUS
     dwServiceType As Long                ‘指示服务类型,创建 Win32 服务。赋值 SERVICE_WIN32
     dwCurrentState As Long               ‘指定服务的当前状态。因为服务的初始化在这里没有完成,所以这里的状态为 SERVICE_START_PENDING
     dwControlsAccepted As Long           ‘这个域通知 SCM 服务接受哪个域。
     dwWin32ExitCode As Long              ‘这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0
     dwServiceSpecificExitCode As Long
     dwCheckPoint As Long                 ‘这两个域表示初始化某个服务进程时要30秒以上
     dwWaitHint As Long
End Type

‘OpenSCManager打开服务管理数据库

‘参数:

‘lpMachineName:    本地计算机
‘lpDatabaseName:   默认的数据库
‘dwDesiredAccess: 所需的访问权
Private Declare Function OpenSCManager Lib “advapi32.dll” Alias _
                           “OpenSCManagerA” (ByVal lpMachineName As String, _
                           ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long

Private Declare Function CloseServiceHandle Lib “advapi32.dll” (ByVal hSCObject _
                           As Long) As Long

‘OpenService获取服务程序的句柄

‘参数:
‘hSCManager :服务控制管理程序微服的登记数据库的句柄。由函数 OpenSCManager function 返回 这个句柄。
‘lpServiceName :将要打开的以NULL 结尾的服务程序的名字,和 CreateService   中的 lpServiceName 相对应。
‘dwDesiredAccess :指定服务的访问类型。服务响应请求时,首先检查访问类型。
‘用CreateService 或OpenService 打开的服务程序句柄使用完毕后必须用CloseServiceHandle 关闭。
‘OpenSCManager打开的服务管理数据库句柄也必须用它来关闭。
Private Declare Function OpenService Lib “advapi32.dll” Alias “OpenServiceA” _
                           (ByVal hSCManager As Long, ByVal lpServiceName As String, _
                           ByVal dwDesiredAccess As Long) As Long

‘StartService用来启动服务

‘参数hService为指向Service的句柄,由OpenService返回。
‘dwNumSe-rviceAr为启动服务所需的参数的个数。
‘lpszServiceArgs为启动服务所需的参数
‘函数执行成功返回True
Private Declare Function StartService Lib “advapi32.dll” Alias “StartServiceA” _
                           (ByVal hService As Long, ByVal dwNumServiceArgs As Long, _
                           ByVal lpServiceArgVectors As Long) As Long

Private Declare Function ControlService Lib “advapi32.dll” (ByVal hService As _
                           Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long

Const GENERIC_EXECUTE = &H20000000     ‘如果是可执行的,则允许执行
Const SERVICE_CONTROL_STOP = 1         ‘停止服务
Const SERVICE_CONTROL_PAUSE = 2        ‘暂停服务
Const SERVICE_CONTROL_CONTINUE = 3     ‘继续服务

‘*************************************************************************
‘**函 数 名: ServiceCommand
‘**输     入: ByVal ServiceName(String) -
‘** 参    数: COMMAND 可以是   0=Start, 1=Stop, 2=Pause, 3=Continue   -
‘**输     出: 返回真执行成功,否则失败
‘**功能描述: 启动/停止/暂停/继续一个服务
‘**说明:      SERVICENAME必须是服务名称而不是显示名称
‘**调用模块:
‘**作     者: Mr.David
‘**日     期: 2007-06-15 09:15:25
‘**修 改 人:
‘**日     期:
‘**版     本: V1.0.0
‘*************************************************************************
Public Function ServiceCommand(ByVal ServiceName As String, ByVal command As Long) As _
                                Boolean

     Dim hSCM As Long
     Dim hService As Long
     Dim res As Long
     Dim lpServiceStatus As SERVICE_STATUS

     ‘首先检查参数
     If command < 0 Or command > 3 Then Err.Raise 5

     ‘获得一台特定主机的服务控制管理器数据库的句柄
     hSCM = OpenSCManager(vbNullString, vbNullString, GENERIC_EXECUTE)
     If hSCM = 0 Then Exit Function

     ‘打开需要开放的服务,如果打开失败则退出
     hService = OpenService(hSCM, ServiceName, GENERIC_EXECUTE)
     If hService = 0 Then GoTo CleanUp

     Select Case command

         ‘打开服务
         Case 0

         res = StartService(hService, 0, 0)

         Case SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE, _
              SERVICE_CONTROL_CONTINUE

         res = ControlService(hService, command, lpServiceStatus)
         Debug.Print res

     End Select

     If res = 0 Then GoTo CleanUp

     ‘执行成功
     ServiceCommand = True

CleanUp:

     ‘关闭服务句柄
     If hService Then CloseServiceHandle hService
     CloseServiceHandle hSCM

End Function

Private Sub cmdStart_Click()

     ServiceCommand “r_server”, 0
     Me.Hide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     ServiceCommand “r_server”, SERVICE_CONTROL_STOP
     Me.Hide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

‘WMI属于封装,了解即可
Option Explicit

Dim services As SWbemServices
Public Locator As SWbemLocator

Private Sub StartServices(ServiceName As String)

     Dim ServiceObject As SWbemObject

     Set Locator = New SWbemLocator
     Set services = Locator.ConnectServer(”.”)

     Set ServiceObject = services.Get(”Win32_Service=’” & ServiceName & “‘”)
     Call ServiceObject.StartService

End Sub

Private Sub StopServices(ServiceName As String)

     Dim ServiceObject As SWbemObject

     Set Locator = New SWbemLocator
     Set services = Locator.ConnectServer(”.”)

     Set ServiceObject = services.Get(”Win32_Service=’” & ServiceName & “‘”)
     Call ServiceObject.StopService

End Sub

Private Sub cmdStart_Click()

     Call StartServices(”r_server”)    ‘注意服务名的输入
     Me.Hide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     Call StopServices(”r_server”)    ‘注意服务名的输入
     Me.Hide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

‘NET

Option Explicit

Private Sub cmdStart_Click()

     Me.Hide
     Shell (”cmd.exe /c net start r_server”), vbHide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     Me.Hide
     Shell (”cmd.exe /c net stop r_server”), vbHide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

相关日志

Leave a Reply