つまり、一般的な説明が非常に詳細であっても、例が不足しているため、クラス/テクノロジーを使用する方法はほとんどありません。 合理的で透過的な使用方法を見つけるために、インターネット上のさまざまなリソースを検索するには非常に長い時間(場合によっては数時間)かかります。
私が持っていた最後の例の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éでのこうした投稿の不適切さについて、有用性とデザインについて、またはその逆についてフィードバックをもらいたいと考えています。 ありがとう