この記事では、Windows Management Instrumentation (WMI) の構成を確認する方法と、WMI 接続またはアクセスの問題を診断してトラブルシューティングする方法について説明します。
WMI の構成または接続に関する問題の例を次に示します。 この問題は、WMI を使用または依存するさまざまな製品やアプリケーションから発生します。
クラスターの作成ウィザードはリモート コンピューター (クラスター ノード) への接続を試みますが、データの取得に失敗します。
Active Directory ロール インストーラーがホスト コンピューターと通信しようとすると、Active Directory ドメイン サービス構成ウィザードは次のエラーで失敗します。
Adprep は、Windows Management Instrumentation (WMI) を介してサーバー
testbox.contoso.com
からデータを取得できませんでした。ローカル WMI クエリは、
Get-WmiObject
PowerShell コマンドレットを使用できず、"アクセス拒否" エラーを受け取ります。
接続フロー
WMI 接続には、複数のコンポーネントとレイヤーが関係しています。 次のコンポーネントは、大まかに関係します。
WMI 接続またはクエリを開始するクライアントまたは管理アプリケーション
ローカルおよびリモートのプロセス間通信 (IPC) に使用されるコンポーネント オブジェクト モデル (COM) または分散コンポーネント オブジェクト モデル (DCOM) コンポーネント
トランスポート層またはネットワーク 層 (リモート プロシージャ コール (RPC))
WMI リポジトリと WMI サービス
WMI プロバイダー
マネージド オブジェクト
問題を特定する
エラーまたはエラーが発生した場所、またはエラーを返すコンポーネントに基づいて、問題は次のように分類できます。
- 接続の問題
- アクセスの問題
- WMI プロバイダーのコア エラー コード
接続の問題
WMI インフラストラクチャへの接続をローカルまたはリモートで確立する前に発生する WMI 接続エラーは、接続の問題と見なされます。
問題またはエラーは、COM/DCOM アーキテクチャによってローカルまたはリモート、トランスポート層 (RPC)、またはファイアウォールによって返されます。 接続の問題ではさまざまなエラーが発生する可能性がありますが、最も一般的なエラーは次のとおりです。
-
0x800706BA
HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE) -
0x80041015
通常の操作を妨げるネットワーク エラーが発生しました。
アクセスの問題
アクセスの問題は、アクセスエラーまたは 1 つ以上の WMI コンポーネントのアクセス許可がないために WMI 接続またはクエリが失敗した場合に発生します。
言い換えると、WMI インフラストラクチャには、COM/DCOM、WMI 名前空間、WMI リポジトリ、プロバイダーなど、複数の領域があり、ユーザーはそれらにアクセス、使用、または操作するための適切なアクセス許可が必要です。 アクセス許可または制限がない場合、WMI 接続エラーが発生し、次のエラーが発生する可能性があります。
-
0x80070005
E_ACCESS_DENIED
DCOM セキュリティによって拒否されたアクセス -
0x80041003
WBEM_E_ACCESS_DENIED
プロバイダーによって拒否されたアクセス
WMI プロバイダーのコア エラー コード
WMI への接続が成功し、適切なアクセス許可を持った後でも、クエリの根本的な問題、プロバイダーによって返されたエラー、無効なクラス、または無効な名前空間が原因で、WMI クエリまたは接続が失敗する可能性があります。
この問題はさまざまな理由が考えられます。エラーは主に WMI サービスによって返されます。
このような場合、返されるエラー コードは問題を理解するのに役立ちます。 いくつかのエラー コードを次に示します。
-
0x80041002 - WBEM_E_NOT_FOUND
-
0x80041004 - WBEM_E_PROVIDER_FAILURE
-
0x80041062 - WBEM_E_PRIVILEGE_NOT_HELD
-
0x8004100E - WBEM_E_INVALID_NAMESPACE
-
0x80041010 - WBEM_E_INVALID_CLASS
-
0x80041011 - WBEM_E_PROVIDER_NOT_FOUND
-
0x80041012 - WBEM_E_INVALID_PROVIDER_REGISTRATION
-
0x80041013 - WBEM_E_PROVIDER_LOAD_FAILURE
WMI インフラストラクチャによって返されるエラーの完全な一覧は、 WMI エラー定数に記載されています。
構成を確認する
問題が返された障害またはエラーに基づいて接続またはアクセスの問題であることを確認できる場合は、WMI の既存の構成を確認するか、ユーザーが適切なアクセス許可を持っていることを確認します。
- 既定では、wmi 名前空間にリモートでアクセスできるのは、 Administrators グループのメンバーだけです。
- WMI を使用してリモート コンピューターに接続するには、接続に対して正しい DCOM 設定と WMI 名前空間のセキュリティ設定が有効になっていることを確認します。
- WMI には、リモート接続のターゲット コンピューターに必要な既定の偽装、認証、および認証サービス (NTLM または Kerberos) の設定があります。 ローカル コンピューターでは、ターゲット システムで受け入れられない異なる既定値が使用される場合があります。 これらの設定は、接続呼び出しで変更できます。
- ローカル コンピューター上の WMI への接続には、既定の認証レベルの
PktPrivacy
があります。 - WMI リモート接続は、ユーザー アカウント制御 (UAC) と Windows ファイアウォールの影響を受けます。
管理者以外のユーザーがコンピューターにリモートでアクセスできるように DCOM セキュリティを設定する
WMI の DCOM 設定は、コントロール パネルの Administrative Tools にある DCOM 構成ユーティリティ (DCOMCnfg.exe) を使用して構成できます。
このユーティリティは、特定のユーザーが DCOM を介してリモートでコンピューターに接続できるようにする設定を公開します。 このユーティリティを使用すると、WMI サービスを開始、アクセス、および構成するようにセキュリティを設定できます。
次の手順では、特定のユーザーとグループに DCOM リモート起動とアクティブ化のアクセス許可を付与する方法について説明します。
コンピューター A がコンピューター B にリモートで接続している場合は、コンピューター B に対してこれらのアクセス許可を設定して、コンピューター B の Administrators グループに含まれていないユーザーまたはグループがコンピューター B で DCOM の起動とアクティブ化の呼び出しを実行できるようにします。
DCOM リモート起動とアクティブ化のアクセス許可をユーザーまたはグループに手動で付与するには、次の手順に従います。
- Start>Run を選択し、「DCOMCNFG」と入力し、OK を選択します。
- Component Services ウィンドウで、Component Services>Computers を展開します。 [マイ コンピューター] を右クリックし、 [プロパティ] を選択します。
- [マイ コンピューターのプロパティ] ダイアログボックスで、[COM セキュリティ] タブを選択します。
- [ 起動とライセンス認証のアクセス許可で、[制限 編集] を選択。
- [起動とアクティブ化のアクセス許可] ダイアログボックスで、名前またはグループが Group またはユーザー名一覧に表示されない場合は、[追加]を選択します。 ユーザー、コンピューター、またはグループの選択] ダイアログ ボックスで、選択するオブジェクト名を入力ボックスに自分の名前とグループを追加し、OKを選択します。
- [ 起動とアクティブ化のアクセス許可 ダイアログで、 Group またはユーザー名 一覧でユーザーとグループを選択します。 <ユーザーまたはグループ>のアクセス許可で、リモート起動 の を許可し、リモートライセンス認証 アクセス許可を をオンにして、[OK] 選択します。
次の手順では、DCOM リモート アクセス許可を特定のユーザーとグループに付与する方法について説明します。 コンピューター A がコンピューター B にリモートで接続している場合は、コンピューター B でこれらのアクセス許可を設定して、コンピューター B の Administrators グループに含まれていないユーザーまたはグループがコンピューター B に接続できるようにします。
DCOM リモート アクセス許可を付与するには、次の手順に従います。
- Start>Run を選択し、「DCOMCNFG」と入力し、OK を選択します。
- Component Services ウィンドウで、Component Services>Computers を展開します。 [マイ コンピューター] を右クリックし、 [プロパティ] を選択します。
- [マイ コンピューターのプロパティ] ダイアログボックスで、[COM セキュリティ] タブを選択します。
- [アクセス許可で、[制限編集] を選択。
- [Access のアクセス許可] ダイアログボックスで、[グループ名またはユーザー名ANONYMOUS LOGON を選択します。 [匿名ログオンのアクセス許可] でAllowで Remote Access アクセス許可を確認し、OK を選択します。
Note
ターゲット コンピューター上のローカルで Distributed COM Users グループにユーザーを追加することもできます。 既定では、このグループには、任意の Windows マシン上の COM/DCOM にアクセスするためのすべてのアクセス許可があります。
ユーザーが特定の WMI 名前空間にアクセスできるようにする
ユーザーが特定の WMI 名前空間にアクセスすることを許可または禁止するには、名前空間の WMI Control で Remote Enable 権限を設定します。 ユーザーがアクセスを許可されていない名前空間にユーザーが接続しようとすると、ユーザーはエラー 0x80041003を受け取ります。
既定では、このアクセス許可は管理者に対してのみ有効になっています。 管理者は、管理者以外のユーザーの特定の WMI 名前空間へのリモート アクセスを有効にすることができます。
次の手順では、管理者以外のユーザー Remote Enable アクセス許可を設定します。
WMIMGMT.msc を使用してリモート コンピューターに接続します。
WMI コントロールを右クリックしProperties を選択します。
Security タブで、名前空間を選択し、Security を選択します。
Note
Root\cimv2 は既定の名前空間です。
適切なアカウントを見つけて追加し、アクセス許可の一覧で Remote Enable と Read Security をオンにします。
Note
サブフォルダーまたはサブ名前空間に同じ権限が継承されるようにするには、 Advancedを選択します。 次に、目的のユーザーを選択し、[アプリケーション]セクションで [この名前空間とサブ名前空間が選択されていることを確認。
特定の名前空間内の特定のクラスへの接続を確認するには、次の手順に従って Windows Management Instrumentation Tester (WBEMTEST) ツールを使用できます。
- WBEMTEST を管理者として開き、 Connect を選択します。 既定では、コンソールはローカル WMI の Root\cimv2 名前空間に接続します。
- 名前空間を、接続をテストしようとしている名前空間に変更します。 リモート コンピューターの場合は、 \\<machinename>\Root\cimv2 の形式で入力します。
接続が成功した場合、WBEMTEST メイン ウィンドウは、指定された既定以外の名前空間に接続されます。
既定では、WBEMTEST 接続では、ログインしているユーザー資格情報が使用されます。 別のアカウントで接続すると、接続を試みる前に資格情報がポップアップ表示されます。
次の例は、User1 の資格情報を使用して 、"RemoteMachine1" の名前空間 root\ccm に接続する試行を示しています。
ドメインに参加しているコンピューターとワークグループ コンピューターの間に WMI 接続を設定するには、ターゲット コンピューターのローカル ユーザーを検討してください。
Note
ターゲット コンピューターの組み込みのローカル管理者を使用する場合、このユーザーは既に他のマシンから WMI にリモートでアクセスするための適切な権限を持っており、追加の構成は必要ありません。
ターゲット コンピューターのファイアウォールでは、受信 WMI 接続を許可する必要があります。この接続に対して、 Windows ファイアウォールの設定 セクションに示すように、上記のファイアウォール構成を実行できます。 次に、「 Set DCOM セキュリティ」に示すように DCOM セキュリティと WMI 名前空間を構成して、管理者以外のユーザーがコンピューターにリモートでアクセスできるようにし Allow ユーザー が特定の WMI 名前空間 セクションにアクセスできるようにします。
Windows ファイアウォールの設定
Windows ファイアウォール設定の WMI 設定では、他の DCOM アプリケーションではなく WMI 接続のみが有効になります。
リモート ターゲット コンピューター上の WMI のファイアウォールで例外を設定する必要があります。
WMI の例外により、WMI はリモート接続を受信できます。 クライアント アプリケーションが独自のシンクを作成する場合、コールバックを成功させるには、そのシンクをファイアウォールの例外に明示的に追加する必要があります。
Windows ファイアウォール UI を介して WMI トラフィックを有効または無効にすることができます。 これを行うには、次の手順を実行します。
- コントロール パネルで、[セキュリティ>Windows ファイアウォール を選択します。
- [設定の変更] を選択し [例外] タブを選択します。
- Exceptions ウィンドウで、 Windows Management Instrumentation (WMI) チェック ボックスをオンにして、ファイアウォール経由の WMI トラフィックを有効にします。 WMI トラフィックを無効にするには、チェック ボックスをオフにします。
WMI 規則グループを使用して、コマンド プロンプトでファイアウォール経由の WMI トラフィックを有効または無効にすることができます。
コマンド プロンプトで次のコマンドを使用して、ファイアウォール経由の WMI トラフィックを有効にします。
netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes
次のコマンドを使用して、ファイアウォール経由の WMI トラフィックを無効にします。
netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=no
単一の WMI ルール グループ コマンドを使用する代わりに、DCOM、WMI サービス、シンクごとに個別のコマンドを使用することもできます。
DCOM、WMI、コールバック シンク、および送信接続に対して個別の規則を使用して WMI トラフィックを有効にするには:
DCOM ポート 135 のファイアウォール例外を確立するには、次のコマンドを使用します。
netsh advfirewall firewall add rule dir=in name="DCOM" program=%systemroot%\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135
WMI サービスのファイアウォール例外を確立するには、次のコマンドを使用します。
netsh advfirewall firewall add rule dir=in name ="WMI" program=%systemroot%\system32\svchost.exe service=winmgmt action = allow protocol=TCP localport=any
リモート コンピューターからコールバックを受信するシンクのファイアウォール例外を確立するには、次のコマンドを使用します。
netsh advfirewall firewall add rule dir=in name ="UnsecApp" program=%systemroot%\system32\wbem\unsecapp.exe action=allow
ローカル コンピューターが非同期的に通信しているリモート コンピューターへの送信接続のファイアウォール例外を確立するには、次のコマンドを使用します。
netsh advfirewall firewall add rule dir=out name ="WMI_OUT" program=%systemroot%\system32\svchost.exe service=winmgmt action=allow protocol=TCP localport=any
DCOM、WMI、コールバック シンク、および送信接続に対して個別の規則を使用して WMI トラフィックを無効にするには:
DCOM 例外を無効にするには、次のコマンドを使用します。
netsh advfirewall firewall delete rule name="DCOM"
WMI サービスの例外を無効にするには、次のコマンドを使用します。
netsh advfirewall firewall delete rule name="WMI"
シンク例外を無効にするには、次のコマンドを使用します。
netsh advfirewall firewall delete rule name="UnsecApp"
送信例外を無効にするには、次のコマンドを使用します。
netsh advfirewall firewall delete rule name="WMI_OUT"
さまざまなシナリオのトラブルシューティング
ほとんどの接続の問題は、不正なアクセス許可、アクセス許可がない、ファイアウォールやウイルス対策ソフトウェアなどの外部要因が原因です。 そのため、構成を確認すると問題が解決する可能性があります。
既定の構成とは別に、一部の追加設定が接続に影響を与える可能性があります。
アプリケーションとシステム イベント ログで、クライアント アプリケーションまたはソース (Microsoft-Windows-DistributedCOM) からログに記録されたエラーを確認し、シナリオに応じてソースまたはターゲット コンピューターに記録される可能性がある関連するエラーまたはイベントを探します。
イベント ビューアー>アプリケーションとサービス ログ>Microsoft>Windows>Windows ファイアウォールのセキュリティが強化された Windows ファイアウォール>ファイアウォールの下にある、ファイアウォールによってブロックされている WMI からの接続のイベント ログを確認します。
特定のグループ ポリシー設定では、RPC と DCOM の既定の動作とアクセス許可を変更できます。 例えば次が挙げられます。
このグループ ポリシーでは、認証されていない RPC 呼び出しを制限できます。これにより、エラーが発生する可能性があります。
RPC サーバーが利用できません。 (HRESULT からの例外: 0x800706BA)
Computer Configuration\Administrative Templates\System\Remote Procedure Call\Restrict Unauthenticated RPC clients
この設定は、RPC サーバー ランタイムが RPC サーバーに接続する認証されていない RPC クライアントを処理する方法を制御します。 このポリシー設定は、WMI を含むすべての RPC アプリケーションに影響します。
このグループ ポリシーでは、カスタム DCOM アクセス許可を構成できます。
コンピューターの構成\Windows の設定\セキュリティ設定\ローカル ポリシー\セキュリティ オプション\DCOM: セキュリティ記述子定義言語 (SDDL) 構文でのコンピューター起動の制限
この設定では、2 つの方法で ACL を指定できます。 SDDL にセキュリティ記述子を入力するか、ユーザーとグループに対するアクセス許可 ローカル アクセスとリモート アクセス アクセス許可を付与または拒否できます。
ターゲット コンピューターの RPC 動的ポート範囲を確認します。
netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
作業マシンと比較します。 ポート範囲が既定以外の場合、または小さい範囲に制限されている場合は、WMI 接続に影響を与える可能性があります。 Windows のサービスの概要とネットワーク ポートの要件には、RPC に必要な既定のポート範囲が表示されます。
問題がアクセスの問題または主要な WMI エラーである場合、受信クエリは、ログ Microsoft-Windows-WMI-Activity/Operationalイベント ビューアー>Applications and Services Logs>Microsoft>Windows>WMI-Activity に記録されます。
一部のシナリオでは、ローカル WMI 接続が失敗することがあります。
WMIMGMT.msc を使用してローカル WMI 接続を確認するには、WMI コントロールを右クリックし、Properties を選択します。
ローカル WMI が失敗したときに発生するいくつかのエラーを次に示します。
-
"WMI: Not Found" <ローカル コンピューターに接続できませんでした>
-
"Win32: システムが指定されたパス <見つけられないため> ローカル コンピューターへの接続に失敗しました。
-
"WMI: 汎用エラー" <ローカル コンピューターに接続できませんでした>
このようなエラーは、WMI リポジトリに障害が発生した場合、または破損が発生した場合に発生することがあります。
管理者特権のコマンド プロンプト ウィンドウで次のコマンドを使用して、ライブまたは現在使用されている WMI リポジトリで整合性チェックを実行できます。
winmgmt /verifyrepository
このコマンドは、 /verifyrepository <path>
を使用して実行することもできます。 path 引数を指定すると、リポジトリの保存済みコピーを確認できます。
この場合、path 引数には、保存されたリポジトリ コピーへの完全なパスが含まれている必要があります。 保存されたリポジトリは、リポジトリ フォルダー全体のコピーである必要があります。
次の手順では、WMI プロバイダー MOF ファイルを再コンパイルし、WMI プロバイダー DLL を再登録する方法について説明します。 これには、すべての組み込みプロバイダーと、既定のパスに配置されたプロバイダーが含まれます。 管理者特権のコマンド プロンプト ウィンドウで次のコマンドを実行します。
Note
次の手順では、WMI サービスを再起動します。
WMI サービスを停止し、
disabled
に設定します。sc config winmgmt start= disabled net stop winmgmt /y
WBEM フォルダーに移動します。
%systemdrive% cd %windir%\system32\wbem
WMI プロバイダーを再登録します。
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
WMI サービスを
Auto
に戻し、サービスを開始します。sc config winmgmt start= Auto net start winmgmt
MOF ファイルを再コンパイルします。
dir /b *.mof *.mfl | findstr /v /i uninstall > moflist.txt & for /F %s in (moflist.txt) do mofcomp %s
Note
WMI リポジトリをリセットしたり、WMI リポジトリを再構築したりするための複数の外部ブログやサイトがあります。 これにより、オペレーティング システムのインストール時に WMI リポジトリが初期状態に戻ります。 WMI は、システム自体、アプリケーション、サービス、およびその周囲の他のエンティティに関して、時間の経過と同時に収集されたすべての情報を失います。 そのため、MICROSOFT サポートによって実行されない限り、WMI リポジトリを再構築することはお勧めしません。
ネットワーク レベルでの接続フロー
次のトレースは、WMIC.exeを使用して WMI クエリを実行しているときに、2 台のコンピューター間でNetwork Monitor を使用してキャプチャされたネットワーク トレースの出力です。
これは、問題がネットワーク接続の問題であるかどうかを判断するのに役立ちます。
ターゲット マシンのポート 135 のエンドポイント マッパーへの接続:
65 9:07:30 AM 3/21/2017 6.2302032 svchost.exe 10.0.0.6 10.0.0.22 TCP TCP:Flags=......S., SrcPort=49229, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=3759018265, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192 {TCP:8, IPv4:7}
IRemoteSCMActivator の RPC インターフェイス UUID の要求:
68 9:07:30 AM 3/21/2017 6.2366981 svchost.exe 10.0.0.6 10.0.0.22 MSRPC MSRPC:c/o Bind: IRemoteSCMActivator(DCOM) UUID{000001A0-0000-0000-C000-000000000046} Call=0x5 Assoc Grp=0x0 Xmit=0x16D0 Recv=0x16D0 {MSRPC:9, TCP:8, IPv4:7}
ターゲット マシンのエンドポイント マッパーによって提供される動的ポートのいずれかに接続します。
77 9:07:30 AM 3/21/2017 6.3539124 WMIC.exe 10.0.0.6 10.0.0.22 TCP TCP:Flags=......S., SrcPort=49230, DstPort=49154, PayloadLen=0, Seq=2143969401, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192 {TCP:10, IPv4:7}
マシン "TargetMachine" の名前空間 Root\CIMV2 への接続:
96 9:07:30 AM 3/21/2017 6.4702188 WMIC.exe 10.0.0.6 10.0.0.22 WMI WMI:IWbemLevel1Login:NTLMLogin Request, NetworkResource=\\TargetMachine\ROOT\CIMV2 PreferredLocale=ms_409,en-US,en Flags=0 {MSRPC:11, TCP:10, IPv4:7}
クエリの実行:
116 9:07:31 AM 3/21/2017 6.7577443 WMIC.exe 10.0.0.6 10.0.0.22 WMI WMI:IWbemServices:ExecQuery Request, *Encrypted* {MSRPC:11, TCP:10, IPv4:7}
データ収集
詳細な調査のためにサポート ケースを開く前に、次の手順に従ってデータを収集できます。
TSS.zipをダウンロードし、内容を抽出します。
管理者特権の PowerShell コマンド プロンプトから次のコマンドレットを実行して、トレースを開始します。
.\TSS.ps1 -UEX_WMIAdvanced -WMIProvList RPC,DCOM -NetshScenario netconnection -noBasicLog
接続エラーを再現するか、エラーが再現されるまで待ちます。 トレースを 2 分以上実行したままにします。
TSS ツールを実行している PowerShell ウィンドウの手順に従って、トレースを停止します。
スクリプトは、すべてのトレース結果と診断情報を含む zip ファイルを作成します。 サポート ケースが作成されたら、分析のためにこのファイルをセキュリティで保護されたワークスペースにアップロードできます。