MID サーバー:WMI/PowerShell の問題と認証情報のトラブルシューティングIssue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } ディスカバリースケジュールを実行した後、認証情報の失敗を示すエラーがディスカバリーログに見つかることがあります。この場合、ディスカバリーステータスは正常に完了しません。 ディスカバリーログに認証情報の失敗が示され、ディスカバリー失敗の実際の原因が MID サーバーの外部にある場合があります。この記事では、Windows マシンのディスカバリーに焦点を当てています。 Facts<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 認証情報 ターゲットの Windows マシンを検出するには、Windows 認証情報を認証情報テーブルに追加する必要があります。これらの認証情報レコードでは、ユーザー名、パスワード、認証情報の種類 (Windows、SSH など)、およびこの認証情報を使用できる MID サーバーを指定します。MID サーバーが起動するか、認証情報が変更されると、MID サーバーは利用可能なすべての認証情報をダウンロードしてキャッシュします。 MID サーバー設定パラメーター この記事で検討する 3 つの主な設定パラメーターは次のとおりです。 mid.use_powershell:true に設定されている場合、MID サーバーは Powershell プローブを実行して WMI および Windows レジストリ値を取得します。mid.powershell.use_credentials:Powershell プローブが、認証情報テーブルで定義された認証情報を使用可能にします。 mid.powershell.local_mid_service_credential_fallback:Powershell プローブが最後の手段としてローカル MID アカウントを使用できるようにします。 Fuji リリース以降、これらのパラメーターはデフォルトで true になっています。 Windows プローブの実行 多くの Windows プローブは、ターゲットマシンからいくつかの WMI および Windows レジストリ値を取得しようとします。 mid.use_powershell 設定パラメーターの値に応じて、2 つの方法があります。 WMIRunner プローブの実行 このプローブは、[ディスカバリー (Discovery)] > [認証情報 (Credentials)]で定義された認証情報を使用できません。 この場合、MID サーバーは、MID サーバーサービスを実行しているアカウントを使用して WMI プロバイダーに接続します。これを「ローカル」MID アカウントと呼びますが、このアカウントはドメインユーザーアカウントの場合もあります。このアカウントは、WMIRunner が機能するようにリモートコンピューターにアクセスするために必要です。 Powershell プローブの実行 このプローブは、[ディスカバリー (Discovery )] > [認証情報 (Credentials)]で定義された認証情報を使用できます。 この場合、MID サーバーは Powershell API を使用して WMI 値を取得します。認証情報を使用して Powershell プローブを実行するように MID サーバーが設定されている場合 (上記の「MID サーバー設定パラメーター」を参照)、最初に定義された認証情報を使用してターゲットマシンへの接続が試行されます。この認証情報が失敗すると、2 番目の認証情報が試行されます。 すべての認証情報が失敗し、MID サーバーが最後の手段としてローカル MID アカウントを使用するように設定されている場合、MID サーバーは MID サーバーを実行しているユーザーで試行します。 簡易プローブのシミュレーション [システムメンテナンス (System Maintenance)] > [スクリプト - バックグラウンド (Scripts - Background)] に移動し、次のスクリプトを実行します。 var mid_server = 'MID_SERVER_1';var target_host = '192.168.200.14'; var debug = true;sendProbeWmiRunner(mid_server, target_host);function sendProbeWmiRunner(mid, host) { var ecc = new GlideRecord('ecc_queue'); ecc.initialize(); ecc.agent = 'mid.server.' + mid; ecc.topic = 'WMIRunner'; ecc.name = 'TestWMI'; ecc.source = host; ecc.queue = 'output'; ecc.payload = '<parameters><parameter name="WMI_FetchData" value="Win32_BIOS.SerialNumber"/><parameter name="port" value="135"/><parameter name="debug" value="' + debug + '"/><parameter name="skip_sensor" value="true"/></parameters>'; ecc.insert(); } 変数 mid_server および target_host は、MID サーバーの名前と、検出しようとしているリモート Windows マシンの IP アドレスに置き換えます。 このスクリプトでは、ターゲットマシンからシリアル番号を取得しようとする MID サーバーに WMIRunner プローブを送信します。mid.use_powershelltrue が true の場合、MID サーバーは WMIRunner プローブを内部で PowerShell に切り替えます。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } すべて Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } Windows プローブのトラブルシューティング ディスカバリースケジュールを実行したところ、WMI/Powershell プローブの実行に起因するエラーがディスカバリーログにいくつか確認されました。上記のように、MID サーバー設定パラメーター mid.use_powershell が false の場合は、WMIRunner プローブのトラブルシューティングを行います。 それ以外の場合は、PowerShell プローブのトラブルシューティングを行います。 WMIRunner プローブのトラブルシューティング - mid.use_powershell:false プローブを送信します (上記の「簡易プローブのシミュレーション」を参照)。ECC キュー ([ディスカバリー (Discovery)] > [ECC キュー (ECC Queue)]) に移動し、[作成済み (Created)] でリストを新しいものから順に並べ替えて、送信したばかりの出力メッセージを確認します (トピックは「WMIRunner」、名前は「TestWMI」)。MID サーバーがプローブを処理するまで数秒待ちます。応答の ECC メッセージが表示されるまで、リストを更新します。メッセージを開き、ペイロードの内容を確認します (小さな [XML] ボタンをクリックすると、ペイロードがフォーマットされます)。結果タグ内のメッセージを確認します。 プローブが成功すると、次のような内容が表示されます。 VMware-56 4d 41 9f 34 6e 0c 3d-1b be f1 3c f7 2c ad 7b 以下は、認証情報が正しくない場合に表示されます。 Connection failed to WMI service.Error: Permission denied Thu May 28 16:24:21 2015 DEBUG: Testing WMI connection to 192.168.200.14 Thu May 28 16:25:03 2015 DEBUG: Appending element: error Thu May 28 16:25:03 2015 DEBUG: getValueText() Thu May 28 16:25:03 2015 DEBUG: valueType: string Thu May 28 16:25:03 2015 DEBUG: Appended: error; Connection failed to WMI service.Error: Permission denied Thu May 28 16:25:03 2015 DEBUG: WMI not running これは、MID サーバーの実行に使用しているアカウントが、WMI API がターゲットマシンに接続するための有効な認証情報ではないことを示しています。 解決策 次の 2 つの解決策があります。 MID サーバーを実行するアカウント (Windows サービス) に、リモートマシンにアクセスするための適切な権限を設定しますmid.use_powershell を true に切り替えます。 これは推奨される方法です。 WMIRunner プローブのトラブルシューティング - mid.use_powershell:false プローブを送信します (上記の「簡易プローブのシミュレーション」を参照)。ECC キュー ([ディスカバリー (Discovery)] > [ECC キュー (ECC Queue)]) に移動し、[作成済み (Created)] でリストを新しいものから順に並べ替えて、送信したばかりの出力メッセージを確認します (トピックは「WMIRunner」、名前は「TestWMI」)。MID サーバーがプローブを処理するまで数秒待ちます。応答の ECC メッセージが表示されるまで、リストを更新します。メッセージを開き、ペイロードの内容を確認します (小さな [XML] ボタンをクリックすると、ペイロードがフォーマットされます)。結果タグ内のメッセージを確認します。 プローブが成功すると、次のような内容が表示されます。 VMware-56 4d 41 9f 34 6e 0c 3d-1b be f1 3c f7 2c ad 7b 以下は、最も頻繁に発生するエラーです。 RPC サーバーを使用できません。 mid.powershell.local_mid_service_credential_fallback: true の場合、入力ペイロードのエラーは次のようになります。 Authentication failure with the local MID server service credential. Failed to access target system.ターゲットシステムの認証情報とファイアウォールの設定をチェックして、アクセスを確認してください。RPC サーバーが利用できません。(Exception from HRESULT: 0x800706BA) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() mid.powershell.local_mid_service_credential_fallback: false の場合、入力ペイロードのエラーは次のようになります。 Failure(s) with available Windows credentials from the instance.Credentials tried: LOCALDOMAIN\mid,autolab1\autouser The RPC server is unavailable.(Exception from HRESULT: 0x800706BA) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() これは非常に紛らわしいエラーです。ほとんどの場合、これは実際には、以下に示すように誤った認証情報が原因で発生する認証エラーではありません。 MID サーバーログ (デバッグが有効になっている場合): MID サーバーは最初に認証情報テーブルの認証情報を使用しようとしますが、終了コード 2 で失敗します (mid.powershell.use_credentials:true の場合)。次に、MID サーバーが実行されているアカウントで試行しますが、終了コード 3 で失敗します (mid.powershell.local_mid_service_credential_fallback:true の場合)。いずれの場合も、RPC サーバーが利用できないことがわかります。(Exception from HRESULT: 0x800706BA) MID サーバーは、ディスカバリーに対して最後の認証情報を実行した結果のエラーの詳細を返します。これらのエラーでは、RPC サーバーが利用できないことがわかります。 (Exception from HRESULT: 0x800706BA)これは、MID サーバーが RPC を使用してリモートマシンにアクセスできないことを示しています。通常、これはリモートマシン上の Windows ファイアウォールが RPC 要求を通過させないことが原因です。 トラブルシューティング MID サーバーからリモートマシンに直接、簡単な Powershell WMI クエリを使用して、アクセスと権限をテストできます。 PowerShell コマンドラインを開き、次のコマンドを実行します。 gwmi win32_operatingsystem -computer 192.168.200.14 -credential 'LOCALDOMAIN\mid' LOCALDOMAIN\mid は、テストする認証情報で置き換えます。以下のような内容が想定されます。 SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 6001 RegisteredUser : Windows User SerialNumber : 12345-OEM-1234567-12345 Version : 6.0.6001 この場合、次のものが表示されます。 Get-WmiObject : The RPC server is unavailable.(HRESULT からの例外: 0x800706BA)At line:1 char:5 + gwmi <<<< win32_operatingsystem -computer 192.168.200.14 -credential 'localdomain\mid' + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand ソリューション ping を使用してリモートマシンへの IP 接続があることを確認し、応答するかどうかを確認します。応答しない場合は、ルーティングに問題があります。ネットワーク管理者に連絡してください。IP に問題がない場合、問題はリモートマシン、または MID サーバーとリモートマシン間のフィルタリングデバイスに関連しています。 解決策は、リモートマシンのファイアウォールの問題を修正することです。RPC/DCOM 関連の問題のトラブルシューティングについては、「」を参照してください。 アクセスが拒否される mid.powershell.local_mid_service_credential_fallback: true の場合、入力ペイロードのエラーは次のようになります。 Authentication failure with the local MID server service credential. Failed to access target system.ターゲットシステムの認証情報とファイアウォールの設定をチェックして、アクセスを確認してください。アクセスが拒否されました。(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() at System.Management.Automation.Cmdlet.DoBeginProcessing() at System.Management.Automation.CommandProcessorBase.DoBegin() mid.powershell.local_mid_service_credential_fallback: false の場合、入力ペイロードのエラーは次のようになります。 Authentication failure(s) with available Windows credentials from the instance.Credentials tried: autolab1\autouserBAD,LOCALDOMAIN\midBAD ローカル MID サービス認証情報が有効になっていない場合、E_ACCESSDENIED エラーメッセージは表示されません。認証失敗のメッセージは信頼できます。ほとんどの場合、これは認証情報が正しくないことが原因です。 MID サーバーログ (デバッグが有効になっている場合): MID サーバーは最初に認証情報テーブルの認証情報を使用しようとしますが、終了コード 1 で失敗します (mid.powershell.use_credentials:true の場合)。次に、MID サーバーが実行されているアカウントで試行しますが、終了コード 3 で失敗します (mid.powershell.local_mid_service_credential_fallback:true の場合)。 MID サーバーは、ディスカバリーに対して最後の認証情報を実行した結果のエラーの詳細を返します。MID サーバーログがリモート認証情報とローカル認証情報のどちらに対しても別のエラーを返すので、少し誤解を招く恐れがあります。次のセクションに進み、これが誤った認証情報の問題であることを確認します。 トラブルシューティング 認証情報のトラブルシューティングを行うには、MID サーバーからリモートマシンに直接、簡単な Powershell WMI クエリを実行します。PowerShell コマンドラインを開き、次のコマンドを実行します。 gwmi win32_operatingsystem -computer 192.168.200.14 -credential 'LOCALDOMAIN\mid' LOCALDOMAIN\mid は、テストする認証情報で置き換えます。次のような内容が想定されます。 SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 6001 RegisteredUser : Windows User SerialNumber : 12345-OEM-1234567-12345 Version : 6.0.6001 ただし、この場合は次の結果を受け取ります。 Get-WmiObject : Access is denied.(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) At line:1 char:5 + gwmi <<<< win32_operatingsystem -computer 192.168.200.14 -credential 'localdomain\mid' + CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand これは、認証情報 (ユーザー名またはパスワード、あるいはその両方) が正しくないことを明確に示しています。 解決策 有効な認証情報を見つけて、ServiceNow で更新します。 メッセージフィルターによってコールがキャンセルされた mid.powershell.local_mid_service_credential_fallback: true の場合、入力ペイロードのエラーは次のようになります。 Authentication failure with the local MID server service credential. Failed to access target system.(Exception from HRESULT: 0x80010002 (RPC_E_CALL_CANCELED)) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() mid.powershell.local_mid_service_credential_fallback: false の場合、入力ペイロードのエラーは次のようになります。 Failure(s) with available Windows credentials from the instance.Credentials tried: AUTOLAB1\autouser,localdomain\mid Call was canceled by the message filter.(Exception from HRESULT: 0x80010002 (RPC_E_CALL_CANCELED)) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() トラブルシューティング このエラーのトラブルシューティング方法は、以前のエラーで使用した方法と似ています。 Powershell テストコマンドを実行し、そこでエラーを再現できるかどうかを確認します。再現できれば、問題は MID サーバーとリモートマシンの間にあります。 このエラーは、RPC 接続がリモートコンピューターによって取り消されていることを示しています。他の Windows マシンに対して同じコマンドを実行して、機能するかどうかを確認します。これにより、問題が 1 つの特定の Windows マシンに限定されていることが確認できます。リモートコンピューターの原因は、Windows ファイアウォールが RCP/DCOM へのアクセスをフィルター処理していることである可能性があります。 解決策 次の 2 つの記事は、これらの問題のトラブルシューティングと修正に役立ちます。 WMI、PowerShell、および Windows ファイアウォール Windows ディスカバリー - リモートマシンでの WMI/Powershell の問題のトラブルシューティング サーバーの実行に失敗した mid.powershell.local_mid_service_credential_fallback: true の場合、入力ペイロードのエラーは次のようになります。 Authentication failure with the local MID server service credential. Failed to access target system.ターゲットシステムの認証情報とファイアウォールの設定をチェックして、アクセスを確認してください。アクセスが拒否されました。(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() at System.Management.Automation.Cmdlet.DoBeginProcessing() at System.Management.Automation.CommandProcessorBase.DoBegin() mid.powershell.local_mid_service_credential_fallback: false の場合、入力ペイロードのエラーは次のようになります。 Failure(s) with available Windows credentials from the instance.Credentials tried: autolab1\autouser,LOCALDOMAIN\mid Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)) Stack Trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Management.ManagementScope.InitializeGuts(Object o) at System.Management.ManagementScope.Initialize() at System.Management.ManagementObjectSearcher.Initialize() at System.Management.ManagementObjectSearcher.Get() at Microsoft.PowerShell.Commands.GetWmiObjectCommand.BeginProcessing() 間違った認証情報を使用すると、E_ACCESSDENIED エラーメッセージが表示されます。 有効な認証情報が使用されている場合は、CO_E_SERVER_EXEC_FAILURE エラーメッセージが表示されます。これは、Windows Management Instrumentation サービスがリモートコンピューターで一時停止または停止している場合に発生します。 トラブルシューティング MID サーバーで PowerShell コマンドラインを開き、次のコマンドを実行します。 gwmi win32_operatingsystem -computer 192.168.200.14 -credential 'LOCALDOMAIN\mid' LOCALDOMAIN\mid は、テストする認証情報で置き換えます。 次のような内容が想定されます。 SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 6001 RegisteredUser : Windows User SerialNumber : 12345-OEM-1234567-12345 Version : 6.0.6001 ただし、この場合は次の結果を受け取ります。 Get-WmiObject : Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)) At line:1 char:5 + gwmi <<<< win32_operatingsystem -computer 192.168.200.14 + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand この問題は通常、Windows Management Instrumentation サービスがリモートマシンでダウンしていることが原因で発生します。 解決策 リモートマシンで Windows Management Instrumentation を起動します。