0

私の職場には、いくつかの Windows サービスをサーバーにインストールするアプリケーションがあります。サイド プロジェクトとして、各サービスの名前の横にある "ライト" (赤または緑のドットが付いた画像ボックス) でこれらのサービスを一覧表示する単純な GUI を作成するように依頼されました。これらのサービスの実行が停止した場合、「ライト」が緑から赤に変わるという考えです。

GUI パーツを作成し、リモート サーバーのサービスをクエリして、関心のあるサービスの配列と比較し、サービスの状態に応じて各サービスの横にある「ライト」を緑/赤に設定します。私がハングアップしている部分は、これらのサービスをリアルタイムで監視する方法ですか? 現在、Form_Load イベントに次のコードがあります。

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

このコードを繰り返し実行する単純なタイマーが最善の方法でしょうか、それとももっと洗練された解決策がありますか? 私は VB.NET と WMI の経験は少しありますが、このようなリアルタイムの監視活動の経験はありません。

4

1 に答える 1

2

まず第一に、接続がタイムアウトしてもUIをフリーズしないようにスレッドに入れます。次に、クロススレッドが面倒になる可能性があるため、組み込みの待機タイマーではなくカスタム待機タイマーを使用します。

待機タイマー:

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

スレッドの例:

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()

これは最もエレガントなソリューションではないかもしれませんが、現在のコードについては、リモート接続について十分に理解していないため、私はそれを行う方法を教えてください。

于 2013-01-09T13:12:35.453 に答える