VIDTAKER.COM

Q&A

System.Management.ManagementEventWatcher - 切断からの回復


私がWMIを通じて複数のリモートマシンを監視することができるアプリケーションを構築しようとしています。 C#の開発者として、私はSystem.Management名前空間を利用することを選択した。

パフォーマンスとスケーラビリティの理由から、私は多くの世論調査ベースの1つ以上の情報を収集するイベント駆動型メソッドを使用することを好む。このように、私はManagementEventWatcherクラスを検討しているとして。

簡単な監視タスクについては、このクラスは、まさに私が欲しいと思われる。私は、オブジェクトを作成することにManagementScope、EventQuery、およびEventWatcherOptionsパラメータを与える、EventArrivedイベントをサブスクライブすると、Startメソッドを(以下の例を簡略化を呼び出す)。

  using SM = System.Management;

  ...

  SM.ManagementEventWatcher    _watcher;
  SM.ConnectionOptions         conxOptions;
  SM.ManagementScope           scope;
  SM.WqlEventQuery             eventQuery;
  SM.EventWatcherOptions       eventOptions;
  SM.EventArrivedEventHandler  handler;

  string  path = @"\\machine\root\cimv2";

  conxOptions = new SM.ConnectionOptions ();
  conxOptions.Username = user;
  conxOptions.Password = password;
  scope = new SM.ManagementScope (path, conxOptions);
  scope.Connect ();

  eventQuery = new SM.WqlEventQuery ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'");

  eventOptions = new SM.EventWatcherOptions ();
  eventOptions.Context.Add ("QueryName", "Process Query");

  _watcher = new SM.ManagementEventWatcher (scope, eventQuery, eventOptions);
  handler = new SM.EventArrivedEventHandler (HandleWMIEvent);
  _watcher.EventArrived += handler;
  _watcher.Start ();

  Console.WriteLine ("Press Any Key To Continue");
  Console.ReadKey ();

  _watcher.Stop ();
  _watcher.EventArrived -= handler;

私はに実行している問題は、それが困難な場合、リモートマシンへの接続がさまざまな手段を通じて(マシンを再起動して壊れて検出するために、ルータダウン、ネットワークケーブルなどを抜いて)です。

ManagementEventWatcherクラスは、接続が失われて決定する任意の手段を提供する、などが停止したイベントは、この現象が発生発生しません表示されません。 ManagementScopeはManagementEventWatcherにはまだtrueに、リンク切れにもかかわらず、IsConnected示して添付オブジェクト。

誰もが接続状態を確認する方法上の任意のアイデアを持っていますか?

私は考えることができる唯一の事はこの時点で行うには定期的にマシンに対してWMIクエリを実行すると、まだ動作を確認し、それだけでローカル>リモート接続とはを確認することができますがManagementScopeオブジェクトを使用して、対応するリモート>ローカル接続。私は私が)接続(クエリを動作と仮定を確認するために使用できる別のWMIクエリをルックアップする可能性が想定が、それはより多くの仕事のように私よりもしなければならないはずだ。



4 Replies

1)

私の知る限り、話すことができるときにそのような場合は入力ManagementExceptionのWMIのエラーコード(0x80041032)wbemErrCallCancelled含まれている例外を受信する何かが起こる。


2)

ポストは、このチェックアウトはここ 。それはどのように検出するときに、リムーバブルディスクが使用して挿入されていますC#の。あなたが提供あなたのWMIコードを利用するにはインライン。


3)

がWMIのイベントコンシューマの2つの種類が - 一時的な永久。あなたが探しているかもしれない永久イベントサブスクリプションです。ここでは、MSDNのことについての簡単な宣伝文句は、

恒久的な消費者はすべての回でWMIイベントを受け取ることができますCOMオブジェクトです。永続的なイベントコンシューマは、WMIイベントをキャプチャする永続オブジェクトとフィルタのセットを使用します。一時的なイベントコンシューマと同様に、WMIオブジェクトとフィルタのシリーズをWMIイベントをキャプチャを設定します。イベントが、フィルタに一致する発生すると、WMIの負荷永久イベントコンシューマとイベントについて、それを通知します。永久的な消費者は、WMIリポジトリに実装されているためとWMIに登録され、実行可能ファイルは、永続的イベントコンシューマが動作し、イベントを受け取るWMIが実行されてそれは、オペレーティングシステムの再起動限り後も作成された後。詳細については、受信参照してくださいすべてのタイムズでイベント。

このMSDNの記事に行くを取得するのに十分であることhttp://msdn.microsoft.com/en-us/library/aa393014%の28VS.85%の29.aspxを

ただし、この問題に対処する私の状況では、我々はデータとして反対のためのポーリングに永久的な消費者を作成することを選んだ。もう1つのオプションが再起動など、特定のイベント(の)監視し、再一時的なイベントコンシューマを登録します。


4)

チャンネルにNetworkAvailabilityChange イベント 、このプロパティはNetworkAvailabilityEventArgs.IsAvailable必要聞かせて接続を介して現在の状況あなたのことを知っているの。と少し余分な作業NetworkAddressChangeのイベントネットワークあなたの意志で聞かせて等を使用すると、知っている情報については、変更アドレスに移動マシン。 。 。 System.Net.NetworkInformation の情報を持って良い。 。 。私はこれを監視するために何かをWMI以外の使用を気にしないと仮定します。