診断用の WMI (Windows Management Instrumentation) の使用

Windows Communication Foundation (WCF) は WCF WMI (Windows Management Instrumentation) プロバイダを介して実行時のサービスの検査データを公開します。

WMI の有効化

WMI は、Web ベースのエンタープライズ管理 (WBEM) 標準をマイクロソフトが実装したものです。WMI SDK 詳細については、 、MSDN ライブラリを参照してください。(https://msdn2.microsoft.com/ja-jp/library/Aa394582.aspx)。WBEM は、アプリケーションが Management Instrumentation を外部管理ツールに開示する業界標準の方法です。

WMI プロバイダは、WBEAM と互換性のあるインターフェイスを通して実行時にインストルメンテーションを公開するコンポーネントです。これは、属性と値のペアを持つ WMI オブジェクトのセットで構成されます。ペアには多くの単純型を指定できます。管理ツールは、実行時にインターフェイスを通してサービスに接続できます。WCF では、アドレス、バインディング、動作、およびリスナなどのサービスの属性が開示されます。

組み込みの WMI プロバイダは、アプリケーションの構成ファイルでアクティブにできます。これは、次のサンプル構成に示すように、system.ServiceModel elementセクションの <diagnostics> ElementwmiProviderEnabled 属性によって行われます。

<system.serviceModel>
    …
    <diagnostics wmiProviderEnabled="true" />
    …
</system.serviceModel>

この構成エントリには、WMI インターフェイスが開示されます。管理アプリケーションはこのインターフェイスを通して接続し、アプリケーションの Management Instrumentation にアクセスできるようになります。

WMI データへのアクセス

WMI データには、複数の異なる方法でアクセスできます。マイクロソフトは、スクリプト用、Visual Basic アプリケーション用、C++ アプリケーション用、および .NET Framework 用の WMI API を提供しています。詳細については、「Using WMI」を参照してください。

ms735120.Caution(ja-jp,VS.90).gif注意 :
.NET Framework 提供のメソッドを使用し、プログラムで WMI データにアクセスする場合、そのようなメソッドは接続確立時に例外をスローする場合があることを認識しておく必要があります。接続は、ManagementObject インスタンスの構築中に確立されませんが、実際のデータ交換が含まれた最初の要求時に確立されます。したがって、try..catch ブロックを使用して例外をキャッチする必要があります。

トレース レベルやメッセージ ログ レベルだけでなく、WMI の System.ServiceModel トレース ソースのメッセージ ログ オプションも変更できます。変更するには、LogMessagesAtServiceLevelLogMessagesAtTransportLevelLogMalformedMessages、および TraceLevel のブール型プロパティを公開する AppDomainInfo インスタンスにアクセスします。そのため、メッセージ ログ用のトレース リスナを構成していても、これらのオプションを構成で false に設定している場合は、後でアプリケーションを実行しているときに true に変更できます。これで、メッセージ ログが実行時に有効になります。同様に、構成ファイルでメッセージ ログを有効にしている場合は、実行時に WMI を使用して無効にできます。

構成ファイルで、メッセージ ログのメッセージ ログ トレース リスナまたはトレースの System.ServiceModel トレース リスナが指定されていない場合、WMI が変更を受け入れても変更は有効になりません。各リスナを設定するプロパティの詳細については、「メッセージ ログの構成」および「トレースの構成」を参照してください。構成で設定された他のすべてのトレース ソースのトレース レベルは、アプリケーションが開始されると有効になり変更できません。

WCF は、スクリプト用に GetOperationCounterInstanceName メソッドを公開します。このメソッドに操作名を指定した場合、このメソッドはパフォーマンス カウンタのインスタンス名を返します。ただし、このメソッドは入力を検証しません。したがって、正しくない操作名を指定した場合、正しくないカウンタ名が返されます。

接続先サービスの WCF クライアントが Service メソッド内に作成されていない場合、Service インスタンスの OutgoingChannel プロパティは、別のサービスに接続するのに、そのサービスにより開かれたチャネルをカウントしません。

注意 : WMI は TimeSpan 値を小数点以下 3 桁までしかサポートしません。たとえば、サービスでプロパティの 1 つを MaxValue に設定した場合、WMI ではその値を小数点以下 3 桁より下を切り捨て表示します。

セキュリティ

WCF WMI プロバイダは環境内のサービスの検索を許しているため、環境へのアクセスの許可については十分に注意する必要があります。既定の "管理者のみ" のアクセスを緩めた場合、信頼性の低いパーティに環境内の機密性のあるデータへのアクセスを許可する場合があります。特にリモート WMI アクセスに対するアクセス許可を緩めた場合、大量の攻撃を受ける可能性があります。過剰の WMI 要求により大量の処理が発生した場合、パフォーマンスが低下する可能性があります。

さらに、MOF ファイルに対するアクセス許可を緩めた場合、信頼性の低いパーティが WMI の動作を操作して WMI スキーマに読み込まれるオブジェクトを変更することができます。たとえば、フィールドを削除して、重要データを管理者から隠したり、例外を設定しないかまたは例外の原因とならないフィールドを追加したりすることができます。

WCF WMI プロバイダの既定では、"メソッドの実行"、"プロバイダによる書き込み"、"アカウントの有効化" 権限が管理者に付与され、"アカウントの有効化" 権限が ASP.NET、ローカル サービス、ネットワーク サービスに付与されます。特に、Windows Vista 以外のプラットフォームでは、ASP.NET アカウントは WMI ServiceModel 名前空間に対して読み取りアクセスが可能です。特定のユーザー グループに対してこれらの権限を付与したくない場合は、WMI プロバイダを非アクティブにするか (既定では無効に設定されています)、特定のユーザー グループのアクセスを無効にする必要があります。

また、構成を使用して WMI を有効にする場合、ユーザー権限が不十分のため WMI が有効にならない場合があります。ただし、このエラーを記録するイベントはイベント ログに書き込まれません。

ユーザー権限のレベルを変更するには、次の手順に従います。

  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックして「compmgmt.msc」と入力します。
  2. [サービスとアプリケーション] の [WMI コントロール] を右クリックして、[プロパティ] をクリックします****。
  3. [セキュリティ] タブを選択し、[Root/ServiceModel] 名前空間に移動します****。[セキュリティ] ボタンをクリックします****。
  4. アクセスを制御するグループまたはユーザーを選択し、[許可] または [拒否] チェックボックスを使用してアクセス許可を構成します****。

リモート WMI オブジェクトのインスタンスへのアクセス

リモート コンピュータの WCF WMI インスタンスにアクセスする必要がある場合、アクセスに使用するツールのパケットのプライバシーを有効にする必要があります。次のセクションでは、WMI CIM Studio、Windows Management Instrumentation テスト、および .NET SDK 2.0 を使用してこれらを実現する方法を説明します。

WMI CIM Studio

WMI Administrative Tools をインストールしている場合は、WMI CIM Studio を使用して WMI インスタンスにアクセスできます。このツールは次のフォルダにあります。

%windir%\Program Files\WMI Tools\

  1. [Connect to namespace:] ウィンドウに「root\ServiceModel」と入力し、[OK] をクリックします****。
  2. [WMI CIM Studio Login] ウィンドウで、[オプション>>] ボタンをクリックしてウィンドウを展開します。[認証レベル] で [パケットのプライバシー] を選択し、[OK] をクリックします****。

Windows Management Instrumentation テスト

このツールは Windows によりインストールされます。このツールを実行するには、[スタート] ボタン、[ファイル名を指定して実行] の順にクリックし、ダイアログ ボックスに「cmd.exe」と入力して [OK] をクリックし、コマンド コンソールを起動します****。次に、コマンド ウィンドウに「wbemtest.exe」と入力します。Windows Management Instrumentation テスト ツールが起動します。

  1. ウィンドウの右上隅にある [接続] ボタンをクリックします****。
  2. 新しいウィンドウの [名前空間] フィールドに「root\ServiceModel」と入力し、[認証レベル] として [パケットのプライバシー] を選択します****。[接続] をクリックします。

マネージ コードの使用

System.Management 名前空間が提供するクラスを使用して、リモートの WMI インスタンスにプログラムでアクセスすることもできます。これを実行する方法を次のコード例に示します。

String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel",    
   this.serviceMachineName);

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);