Search code examples
vb.nettimerwmimonitoring

VB.NET/WMI - Real-Time Windows Service Monitoring?


So there's an application at my work that installs several Windows services to a server. As a side project, I've been asked to make a simple GUI that will list these services with a "light" (a picture box with a red or green dot) next to the name of each service. The idea is that in the event these services were to stop running, the "light" would change from green to red.

I have the GUI part built, and I can query a remote server's services, then compare it to an array of the ones I'm interested and set the "light" next to each service to green/red depending on the service state. The part I'm hung up on is how to monitor these services in real time? Currently, I just have the following code in the Form_Load event:

Dim myConnectionOptions As New System.Management.ConnectionOptions
With myConnectionOptions
    .Impersonation = System.Management.ImpersonationLevel.Impersonate
    .Authentication = System.Management.AuthenticationLevel.Packet
End With

Try

    Dim myManagementScope As System.Management.ManagementScope
    myManagementScope = New System.Management.ManagementScope("\\" & SERVERNAME & "\root\cimv2", myConnectionOptions)
    myManagementScope.Connect()

    Dim query As New Management.ObjectQuery("SELECT * FROM Win32_Service")
    Dim searcher As New Management.ManagementObjectSearcher(myManagementScope, query)
    Dim i As Integer = 0

    For Each queryObj As Management.ManagementObject In searcher.Get()
        For Each service As String In arrServices
            If queryObj("DisplayName").Equals(service) Then
                If queryObj("State").Equals("Stopped") Then
                    arrLights(i).Image = My.Resources.redlight
                End If
                i += 1
            End If
        Next
    Next

Catch err As Management.ManagementException
    MessageBox.Show("WMI query failed with the following error: " & err.Message)
Catch unauthorizedErr As System.UnauthorizedAccessException
    MessageBox.Show("Authentication error: " & unauthorizedErr.Message)
End Try

Would a simple timer that executes this code repeatedly be the best approach, or is there a more elegant solution? I have a little experience in VB.NET and WMI, but none in any type of real-time monitoring activity like this.


Solution

  • First of all i would put it into a thread, that way even if your connection times out you dont freeze your UI, then i would use a custom wait timer not the built in one as cross threading can be a pain.

    wait timer:

    Public Sub Wait(ByVal wait_time As Integer)
      Dim time As Date
      time = Now.AddMilliseconds(wait_time)
      Do While time > Now
         Application.DoEvents()
      Loop
    End Sub
    

    example of threading:

    Private services_check As Thread
    private sub form1_load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    services_check = new thread(AddressOf 'Current code in a public sub')
    services_cheack.IsBackground = True
    Services_check.start()
    

    It may not be the most elegant solution but its how i would do it, as for your current code im sorry i dont know enough about remote connections to help you.