Share via


WMI に関する特定の問題のトラブルシューティング

ドライバーの WMI クラスが \root\wmi 名前空間に表示されない

  1. wmimofckdriver.bmf を使用してバイナリ MOF ファイル形式が正しいかどうか確認します。 その他のエラー メッセージは、mofcomp.log にあります。

  2. システム イベント ログを調べて、登録要求に応答して、ドライバーが形式に誤りがある WMIREGINFO データ構造を返していないかどうかを確認します。

  3. ドライバーが WMIREGINFO 構造体内の RegistryPathMofResourceName の正しい値を返していることを確認します。

  4. ドライバーが別のファイルに MOF データを提供する場合は、ドライバーの MofImagePath レジストリ値が正しく設定されていることを確認します。

  5. WMI WDM プロバイダー ログでエラーを確認します。

  6. Mofcomp を使用して MOF テキスト ファイルを再コンパイルして再読み込みします。 たとえば、コマンド mofcomp -N:root/wmi driver.mof は、driver.mof ファイル内の MOF データの再コンパイルと再読み込みを試みます。 Mofcomp が mofcomp.log で生成するエラー メッセージを確認します。 (MOF ファイルで #define などのプリプロセッサ ディレクティブを使用する場合は、元のソース ファイルではなく、既に前処理済みの MOF ファイルを使用する必要があることに注意してください。)

    警告: この操作が成功すると、新しい WMI クラス データがシステムに実際に登録されます。 ドライバーの MOF データが正しく読み取られているかどうかをテストするには、(Wbemtest などを使用して) これらのクラスを削除する必要があります。

  7. 前の手順が成功している場合、最も可能性の高い問題は、MofResourceName などの WMIREGINFO のメンバーが正しく指定されていないことです。 または、MOF ファイルが、存在しない基底クラスから派生したクラスを指定している場合もあります。

  8. ドライバーが動的 MOF データを使用している場合 (動的 MOF データの実装を参照)、ドライバーが MSWmi_MofData_GUID GUID の WMI IRP 要求を受信していること、およびエラーがログに記録されていない状態で IRP が正常に完了していることを確認します。

ドライバーの WMI プロパティまたはメソッドにアクセスできない

  1. wmimofckdriver.bmf を使用してバイナリ MOF ファイル形式が正しいかどうか確認します。 詳細については、wmimofck.exe の使用を参照してください。

  2. システム イベント ログでエラーを確認します。 詳細については、WMI IRP とシステム イベント ログを参照してください。

  3. WMI WDM プロバイダー ログでエラーを確認します。

  4. Wbemtest を使用してドライバーのクラスにクエリを実行するたびに、ドライバーが WMI IRP を受け取っていることを確認します。 そうでない場合は、MOF ファイル内の指定された GUID がドライバーが想定している GUID と一致していることをします。 また、ドライバーが WMI 登録要求を受信していること、成功していること、およびドライバーが適切な GUID を登録していることを確認します。

  5. ドライバーが IRP を受け取った場合は、IRP が正常に完了し、ドライバーが正しい種類の WNODE_XXX 構造体を返していることを確認します。

  6. Wbemtest がエラーを返す場合は、[詳細情報] ボタンをクリックし、エラーの説明の Description プロパティを確認します。

  7. メソッドの場合は、ドライバーがメソッドの GUID の IRP_MN_QUERY_ALL_DATA 要求と IRP_MN_QUERY_SINGLE_INSTANCE 要求の処理をサポートしていることを確認します。 WMI は、メソッドを実行する前に、常にこれら 2 つの要求のいずれかを実行します。

ドライバーの WMI イベントが受信されない

  1. システム イベント ログでエラーを確認します。 たとえば、IoWMIWriteEvent を呼び出すときにドライバーが静的イベント名を指定したが、ドライバーが静的イベント名を登録しなかった場合、システム イベント ログにエントリが生成されます。

  2. WMI WDM プロバイダー ログでエラーを確認します。

  3. ドライバーがイベント参照を送信している場合、ドライバーは、イベント参照を送信した直後に IRP_MN_QUERY_SINGLE_INSTANCE 要求を受け取る必要があります。 ドライバーが IRP を受け取らない場合、WNODE_EVENT_REFERENCE 構造体の形式に誤りがある可能性があります。 ドライバーが IRP を受け取った場合は、状態 STATUS_SUCCESS で完了している必要があります。

  4. ドライバーが IoWMIWriteEvent を使用してイベントまたはイベント参照を送信する場合は、イベント構造 (WNODE_SINGLE_INSTANCE または WNODE_EVENT_REFERENCE) が正しく入力されていることを確認します。 特に、イベント GUID が静的インスタンス名に登録されている場合は、正しいインスタンス インデックスとプロバイダー ID が指定されていることを確認します。 イベント GUID が動的インスタンス名に登録されている場合は、イベントの送信時にインスタンス名が含まれていることを確認します。 WNODE_EVENT_REFERENCE 構造体を使用してイベントを指定する場合は、Wnode.GuidTargetGuid と一致していることを確認します。

  5. ドライバーが WmiFireEvent を使用してイベントを送信する場合は、Guid パラメーターと InstanceIndex パラメーターに正しい値が渡されていることを確認します。

WMI 要求のセキュリティ設定の変更が有効にならない

  • WMI WDM プロバイダーをアンロードして再読み込みします。 WMIREG_FLAG_EXPENSIVE フラグに登録されている WMI データ ブロックの場合、プロバイダーは、そのブロックのコンシューマーが存在する限り、データ ブロックに対してハンドルを開いたままにします。 新しいセキュリティ設定は、プロバイダーがハンドルを閉じるまで有効になりません。 プロバイダーをアンロードして再読み込みすることによって、ハンドルが閉じられていることを確認します。 (WMIREG_FLAG_EXPENSIVE フラグの詳細については、WMIREGGUID を参照してください。)