つまり、一般的な説明が非常に詳細であっても、例が不足しているため、クラス/テクノロジーを使用する方法はほとんどありません。 合理的で透過的な使用方法を見つけるために、インターネット上のさまざまなリソースを検索するには非常に長い時間(場合によっては数時間)かかります。
私が持っていた最後の例の1つは、C#コード内でMicrosoft Network Load Balance( ここに表示されているもの )を使用したことです。 VBスクリプトからNLBを使用する例は多くあり、マネージコードから使用する例はほとんどありません。
タスク :特定の時間におけるマシン(クラスター)のステータスを決定します。
既存のソリューション :ポーリング-WMIを介したクエリを通じてステータスを決定します。
短所 :イベント自体の時点で状態の変更を見逃す可能性が高く、情報が不足しているため、状態を読み取るのにかかる時間が長くなります。
可能なアプローチ :「イベント」のメカニズムの適用。 このようなメカニズムは、例があっても存在しますが、コード内で使用するためのものではありません。
解決策 :
mainメソッドの宣言:
」
 String mePath = "\\\\localhost\\root\\MicrosoftNLB" ; 
      
        
        
        
      
     ManagementEventWatcher watcher1 = new ManagementEventWatcher(mePath, "SELECT * FROM MicrosoftNLB_NodeControlEvent" ); 
      
        
        
        
      
     watcher1.EventArrived += new EventArrivedEventHandler(watcher_NodeControlEventArrived); 
      
        
        
        
      
     watcher1.Options.Timeout = new TimeSpan (0, 0, 1); 
      
        
        
        
      
     watcher1.Start(); //need Stop!!!!!!! 
      
        
        
        
      
     
      
        
        
        
      
     * This source code was highlighted with Source Code Highlighter .
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    String mePath = "\\\\localhost\\root\\MicrosoftNLB" ;
ManagementEventWatcher watcher1 = new ManagementEventWatcher(mePath, "SELECT * FROM MicrosoftNLB_NodeControlEvent" );
watcher1.EventArrived += new EventArrivedEventHandler(watcher_NodeControlEventArrived);
watcher1.Options.Timeout = new TimeSpan (0, 0, 1);
watcher1.Start(); //need Stop!!!!!!!
* This source code was highlighted with Source Code Highlighter .
」
イベント通知を受信するためのコールバックの説明:
 static void watcher_NodeControlEventArrived( object sender, EventArrivedEventArgs e) 
      
        
        
        
      
     { 
      
        
        
        
      
     //http://msdn.microsoft.com/en-us/library/bb736304(VS.85).aspx 
      
        
        
        
      
     ManagementEventWatcher watcher = (ManagementEventWatcher)sender; 
      
        
        
        
      
     Console .WriteLine(watcher.Query.QueryString.ToString()); 
      
        
        
        
      
     PropertyData property; 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "Id" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "InstanceName" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "Active" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "AdapterGuid" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "ClusterIPAddress" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     if ((property = e.NewEvent.Properties[ "HostPriority" ]) != null ) 
      
        
        
        
      
     { 
      
        
        
        
      
     Console .WriteLine(property.Name + ": " + property.Value); 
      
        
        
        
      
     } 
      
        
        
        
      
     } 
      
        
        
        
      
     
      
        
        
        
      
     * This source code was highlighted with Source Code Highlighter .
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    static void watcher_NodeControlEventArrived( object sender, EventArrivedEventArgs e)
{
//http://msdn.microsoft.com/en-us/library/bb736304(VS.85).aspx
ManagementEventWatcher watcher = (ManagementEventWatcher)sender;
Console .WriteLine(watcher.Query.QueryString.ToString());
PropertyData property;
if ((property = e.NewEvent.Properties[ "Id" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
if ((property = e.NewEvent.Properties[ "InstanceName" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
if ((property = e.NewEvent.Properties[ "Active" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
if ((property = e.NewEvent.Properties[ "AdapterGuid" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
if ((property = e.NewEvent.Properties[ "ClusterIPAddress" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
if ((property = e.NewEvent.Properties[ "HostPriority" ]) != null )
{
Console .WriteLine(property.Name + ": " + property.Value);
}
}
* This source code was highlighted with Source Code Highlighter .
」
コメント :
「 MicrosoftNLB_NodeControlEvent 」の代わりに、他のイベントも受け取ることができます-「 ネットワーク負荷分散WMIクラス 」の完全なリストを参照し、それに応じてイベント構造からプロパティを読み取ります。
追伸 これが私の「ペンテスト」です。 Habréでのこうした投稿の不適切さについて、有用性とデザインについて、またはその逆についてフィードバックをもらいたいと考えています。 ありがとう