回 帖 发 新 帖 刷新版面

主题:用WMI对象修改系统服务启动类型以及停止和启用服务的代码

用WMI对象修改系统服务启动类型以及停止和启用服务的代码


一、代码中可能要用到的WMI对象关于服务的几个属性和方法。


表一:属性
-------------------------------------------------------------------
顺号 属性类型 属性名称   描述      属性值
-------------------------------------------------------------------
①  字符   DisplayName  服务名称
②  字符   Description  服务描述
③  字符   StartMode   服务启动类型  Auto,Manual,Disabled
④  字符   state     服务状态    Stopped,Running
⑤  字符   PathName   服务程序路径
⑥  字符   StartName   服务登录身份
⑦  数值   StartService 与④相似,   0,2,8,10,14
-------------------------------------------------------------------
说明:
1.启动类型3个字符串值的中译意为:自动、手动、禁用
2.服务状态2个字符串值的中译意为:已停用、已启动
3.5个数值表示:0、2、8-已停止(手动),10-已启动(自动、手动),14-已停止(禁用)


表二:方法
-------------------------------------------
顺号 名称     描述
-------------------------------------------
① StopService  停止某项服务
② StartService  启动某项服务
③ Change     修改某项服务的启动类型
-------------------------------------------
说明:
1.Change的输入参数有3个选择值:Disabled(禁用)、Manual(手动)、Automatic(自动),输入格式举例:Change(, , , , "Disabled")


二、获取服务的启动类型和状态
用WMI对象获取系统服务的启动类型和状态,有两种方式可以达到目的,下面分别介绍。


1.第一种方式
新建一个工程,在【工程】→【部件】中添加“Microsoft Windows Common Controls 6.0”,在【工程】→【引用】中添加“Microsoft WMI Scripting V1.1 Library”,然后在Form1窗体上添加1个ListView1和一个命令按纽,在代码窗口添加如下代码:


Private Sub Form_Load()
Me.Caption = "服务"
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , , "名称", 2600
ListView1.ColumnHeaders.Add , , "状态", 1000
ListView1.ColumnHeaders.Add , , "启动类型", 800
ListView1.ColumnHeaders.Add , , "服务程序文件路径", 5000
ListView1.ColumnHeaders.Add , , "登录身份", 1400
ListView1.View = lvwReport
End Sub


Private Sub Command1_Click()
Dim objSWbemLocator As SWbemLocator
Dim objSWbemServices As SWbemServices
Dim ServiceSet As SWbemObjectSet
Dim s As SWbemObject
Dim strComputer As String   '指定计算机名
Dim strNameSpace As String  '指定命名空间
Dim strClass As String      '指定类
Dim state As String         '服务状态
Dim start As String         '服务启动方式
Dim i As Long
ListView1.ListItems.Clear

strComputer = "."           '指定计算机名,“.”为本机
strNameSpace = "root/cimv2" '指定命名空间为root/cimv2
strClass = "Win32_Service"  '指定类为Win32_Service

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")                '建立1个WBEM对象的引用指针
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace) '连接到指定计算机、命名空间的WMI,返回一个对 SWbemServices 对象的引用
Set ServiceSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)        '通过WQL查询,返回指定类的所有实例

For Each s In ServiceSet
  state = IIf(s.state = "Stopped", "已停止", "已启动")
  start = IIf(s.StartMode = "Manual", "手动", IIf(s.StartMode = "Auto", "自动", "禁用"))
  ListView1.ListItems.Add , "a" & i, s.DisplayName       '服务名称添加到第一列
  ListView1.ListItems("a" & i).SubItems(1) = state       '服务状态添加到第二列
  ListView1.ListItems("a" & i).SubItems(2) = start       '服务启动方式添加到第三列
  ListView1.ListItems("a" & i).SubItems(3) = s.PathName  '服务程序的路径添加到第四列
  ListView1.ListItems("a" & i).SubItems(4) = s.StartName '服务的登录身份添加到第五列
  i = i + 1
Next

Set s = Nothing
Set ServiceSet = Nothing
End Sub


2.第二种方法
新建一个工程,在【工程】→【部件】中添加“Microsoft Windows Common Controls 6.0”,然后在Form1窗体上添加一个ListView1和一个命令按纽,在代码窗口添加如下代码:


Form_Load过程同上


Private Sub Command2_Click()
Dim s, ServiceSet
Dim state As String         '服务状态
Dim start As String         '服务启动方式
Dim i As Long
ListView1.ListItems.Clear
Set ServiceSet = GetObject("winmgmts:").InstancesOf("Win32_Service")

For Each s In ServiceSet
  state = IIf(s.state = "Stopped", "已停止", "已启动")
  start = IIf(s.StartMode = "Manual", "手动", IIf(s.StartMode = "Auto", "自动", "禁用"))
  ListView1.ListItems.Add , "a" & i, s.DisplayName       '服务名称添加到第一列
  ListView1.ListItems("a" & i).SubItems(1) = state       '服务状态添加到第二列
  ListView1.ListItems("a" & i).SubItems(2) = start       '服务启动类型添加到第三列
  ListView1.ListItems("a" & i).SubItems(3) = s.PathName  '服务程序的路径添加到第四列
  ListView1.ListItems("a" & i).SubItems(4) = s.StartName '服务的登录身份添加到第五列
  i = i + 1
Next

Set ServiceSet = Nothing
End Sub


可以看出,以上两种方法,第二种方法更加简炼。下面,我们就在第二种方法的基础上,进行单项服务的查询、停止、开启和修改启动类型。
在下面的代码中,笔者选择了6个非系统服务来做我们的实验。
特别要注意的是:以下代码中,字符串变量sstr的值是服务名称,这个名称不是上面两种方法的服务名称,而是注册表中该服务最后一个子项的名称!

回复列表 (共1个回复)

沙发

 三、查询单项服务的启动类型和运行状态

Form_Load过程同上


Private Sub Command3_Click()
Dim sstr As String, state1 As String, state2 As String, st As String, i As Integer
Dim s, ServiceSet
ListView1.ListItems.Clear

For i = 0 To 5
  Select Case i
    Case 0: sstr = "XLServicePlatform"    '迅雷下载服务
    Case 1: sstr = "Flash Helper Service" '重庆Flash服务
    Case 2: sstr = "dsmainsrv"            '360云查杀服务
    Case 3: sstr = "ZhuDongFangYu"        '360主动防御服务
    Case 4: sstr = "QPCore"               '腾讯安全服务
    Case 5: sstr = "QQLiveService"        '腾讯视频加速服务
  End Select

  Set ServiceSet = GetObject("winmgmts:").InstancesOf("Win32_Service" & " where Name='" & sstr & "'")
  For Each s In ServiceSet
    st = LCase(s.StartMode)
    state1 = IIf(st = "manual", "手动", IIf(st = "auto", "自动", "禁用"))
    st = LCase(s.state)
    state2 = IIf(st = "stopped", "已停用", "已启动")
  Next
  ListView1.ListItems.Add , "a" & i, sstr           '服务名称添加到第一列
  ListView1.ListItems("a" & i).SubItems(1) = state2 '服务状态添加到第二列
  ListView1.ListItems("a" & i).SubItems(2) = state1 '启动类型添加到第三列
Next

Set ServiceSet = Nothing
End Sub


四、停止某项服务

Private Sub Command4_Click()
Dim st As String
st = "XLServicePlatform"    '迅雷下载服务
If 停止服务(st) = 0 Then MsgBox "服务已停止"
End Sub


Private Function 停止服务(sstr As String) As Long
Dim retval As Long, s, ServiceSet
Set ServiceSet = GetObject("winmgmts:").ExecQuery("select * from Win32_Service" & " where Name='" & sstr & "'")
For Each s In ServiceSet
  retval = s.StopService
Next
Set ServiceSet = Nothing
停止服务 = retval
End Function


五、启动某项服务

Private Sub Command5_Click()
Dim st As String
st = "XLServicePlatform"    '迅雷下载服务
If 启动服务(st) = 0 Then MsgBox "服务已经启动"
End Sub


Private Function 启动服务(sstr As String) As Long
Dim retval As Long, s, ServiceSet
Set ServiceSet = GetObject("winmgmts:").ExecQuery("select * from Win32_Service" & " where Name='" & sstr & "'")
For Each s In ServiceSet
  retval = s.StartService
Next
Set ServiceSet = Nothing
启动服务 = retval
End Function


六、修改服务的启动类型

Private Sub Command6_Click()
Dim st1 As String, st2 As String
st1 = "XLServicePlatform" '迅雷下载服务
st2 = "Disabled"          '修改为禁用
If 修改启动类型(st1, st2) = 0 Then MsgBox "启动类型修改完成"
End Sub


Private Function 修改启动类型(sstr As String, smode As String) As Long
Dim retval As Long, s, ServiceSet
Set ServiceSet = GetObject("winmgmts:").ExecQuery("select * from Win32_Service" & " where Name='" & sstr & "'")
For Each s In ServiceSet
  retval = s.Change(, , , , smode)
Next
Set ServiceSet = Nothing
修改启动类型 = retval
End Function


以上代码均已在32位windows7计算机上通过。

我来回复

您尚未登录,请登录后再回复。点此登录或注册