主题:用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的值是服务名称,这个名称不是上面两种方法的服务名称,而是注册表中该服务最后一个子项的名称!