乔丹二世 发表于 2011-8-19 07:48:29

[陈辉经典文章]利用WMI进行服务监视

VERSION 5.00
Begin VB.Form frmMain
   Caption         =   "服务监视"
   ClientHeight    =   2730
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth   =   3990
   LinkTopic       =   "Form1"
   ScaleHeight   =   2730
   ScaleWidth      =   3990
   StartUpPosition =   2'屏幕中心
   Begin VB.CommandButton cmdAdd
      Caption         =   "添加"
      Height          =   375
      Left            =   2880
      TabIndex      =   2
      Top             =   120
      Width         =   975
   End
   Begin VB.TextBox textInput
      Height          =   375
      Left            =   120
      TabIndex      =   1
      Text            =   "请输入监视的服务名"
      Top             =   120
      Width         =   2415
   End
   Begin VB.ListBox listServices
      Height          =   1860
      Left            =   120
      TabIndex      =   0
      Top             =   720
      Width         =   3735
   End
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private objSWbemServices As SWbemServices
Private WithEvents objSWbemSink As SWbemSink
Attribute objSWbemSink.VB_VarHelpID = -1

Private Sub cmdAdd_Click()
    If textInput.Text <> "" And textInput.Text <> "请输入监视的服务名" Then
      listServices.AddItem textInput.Text
      textInput.Text = ""
    Else
      MsgBox "请输入需要监视的服务名!!", vbCritical, "提示"
      textInput.Text = ""
      textInput.SetFocus
    End If
End Sub

Private Sub Form_Load()
    Dim strNameSpace As String
    strNameSpace = "root\cimv2" '指定命名空间为root\cimv2
    Set objSWbemSink = New SWbemSink
    Set objSWbemServices = GetObject("winmgmts:\\" & "." & "\" & strNameSpace)'建立指定计算机、命名空间的WMI的SWbemServices 对象的引用
    objSWbemServices.ExecNotificationQueryAsync objSWbemSink, "SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Service'" & " AND TargetInstance.State='Stopped'"
End Sub                                                                      '__InstanceDeletionEvent

Private Sub Form_Unload(Cancel As Integer)
    objSWbemSink.Cancel
End Sub

'进程创建事件
Private Sub objSWbemSink_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
    'MsgBox objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("Name").Value & "服务已经停止"
    Dim i As Integer, flag As Boolean
    For i = 0 To listServices.ListCount - 1
      If LCase(listServices.List(i)) = LCase(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("Name").Value) Then
            flag = True
            Exit For
      End If
    Next
    If flag = True Then
      Dim swMethods As SWbemMethodSet, swMethod As SWbemMethod, swServers As SWbemServices, swObjSet As SWbemObjectSet, swObj As SWbemObject
      'Dim swProperty As SWbemProperty, swPropertys As SWbemPropertySet
      Set swServers = GetObject("winmgmts:\\" & "." & "\" & "root\cimv2")
      Set swObjSet = swServers.ExecQuery("Select * From Win32_Service WHERE Name='" & objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("Name").Value & "'")
      For Each swObj In swObjSet
            Set swMethods = swObj.Methods_
            swObj.ExecMethod_ ("StartService")
    '      For Each swMethod In swMethods
    ''            If LCase(swMethod.Name) = "startservice" Then
    '                Set swPropertys = swObj.Properties_
    '                For Each swProperty In swPropertys
    '                  MsgBox swProperty.Value
    '                Next
    ''            End If
    '            'MsgBox swMethod.Name
    '      Next
      Next
    End If
End Sub

Private Sub textInput_GotFocus()
    textInput.SelStart = 0
    textInput.SelLength = Len(textInput.Text)
End Sub

testid 发表于 2011-10-20 15:10:57

好帖子,顶一下!
页: [1]
查看完整版本: [陈辉经典文章]利用WMI进行服务监视