ソフトウェア インベントリの動作説明

Published: / Last update:
この記事の内容
  1. 全体の流れ
  2. 動作説明の前提
  3. 設定と一般的な実行方法
  4. 各ステップとログの追跡方法
    1. 関連ログ
    2. 掲載する処理と識別子
    3. ステップ 1 : クライアント ポリシーを取得・評価し、設定を反映する
    4. ステップ 2 : ソフトウェア インベントリを開始し、対象ファイルの情報を収集する
    5. ステップ 3 : 収集結果からインベントリ レポートを生成する
    6. ステップ 4 : レポートを MP へ転送する
  5. 参考リンク

皆様、こんにちは。Configuration Manager / WSUS サポート チームです。

本記事では、[Configuration Manager] クライアントの [ソフトウェア インベントリ] について、ポリシーの取得・評価からファイル情報の収集、レポート生成、管理ポイント (Management Point、以下 MP) への転送までを説明します。

[ソフトウェア インベントリ] は、指定したファイルの名前、サイズ、バージョンなどの情報を収集する機能です。インストール済みアプリケーションの一覧を取得する [ハードウェア インベントリ]、ファイル実体を収集する [ファイル収集]、および MP から先のサイト サーバーやデータベースでの処理は、本記事の対象外です。

サイト コード、環境固有の識別子、収集対象のパス、MP のホスト名を一貫した表記へ匿名化しています。途中の行を省略した箇所には「(中略)」を記載しています。

全体の流れ

設定の反映からレポートの転送までは、次の順序で確認します。

  1. クライアント ポリシーを取得・評価し、設定を反映します。
  2. ソフトウェア インベントリを開始し、対象ファイルの情報を収集します。
  3. 収集結果からインベントリ レポートを生成します。
  4. レポートを MP へ転送します。

ポリシーの取得・評価とインベントリの実行は、それぞれのタイミングで行われる別の処理です。ここでは、設定の反映からレポートの転送までを順に紹介します。

動作説明の前提

本記事では、初回のフル インベントリと、その後の差分インベントリのログを紹介します。両者は別々の実行であり、ステップ 2 でレポート種別の違いを確認した後、差分の実行例を使って、ファイル情報の収集から MP への転送までを追跡します。ステップ 1 のポリシー取得・評価も、この差分インベントリに先立つ記録を使用します。

掲載ログの開始操作は特定していないため、後述の手動操作は、必要に応じて実行を開始する場合の一般的な方法として紹介します。

設定と一般的な実行方法

[ソフトウェア インベントリ] の有効化と実行スケジュールは、[クライアント設定] の [ソフトウェア インベントリ] で構成します。収集する情報を確認する際は、次の項目を確認します。

確認する設定 内容
有効化とスケジュール クライアントで機能を有効にするか、どの間隔で実行するかを指定します。
レポートの詳細 レポートするファイル情報の詳細レベルを指定します。
対象ファイル ファイル名や拡張子のパターン、検索場所、サブフォルダーを検索するかを指定します。
除外条件 Windows フォルダー内のファイル、暗号化ファイル、圧縮ファイルを除外するかを指定します。

複数のカスタム クライアント設定が適用される場合、それぞれが返すインベントリはマージされます。適用される設定全体を確認すると、収集対象を把握しやすくなります。[ファイル収集] はファイル実体を収集する別の設定であり、本記事では使用方法を扱いません。

設定変更は、クライアントが次にクライアント ポリシーをダウンロードした際に反映されます。[既定のクライアント設定] の変更は階層全体のコンピューターに適用されるため、一部のデバイスだけを対象とする場合は、カスタム クライアント デバイス設定を作成して対象コレクションへ割り当てます。

必要に応じて、クライアントの [コントロール パネル] - [Configuration Manager] - [操作] タブから、次のサイクルを手動で開始できます。

  • [コンピューター ポリシーの取得および評価サイクル] : クライアント ポリシーの取得・評価を開始します。
  • [ソフトウェア インベントリ サイクル] : ソフトウェア インベントリの実行を開始します。

設定の適用結果の確認は クライアント設定が適用されない!確認すべき 3 つのポイント、手動サイクルとその名称は Configuration Manager で、できる限り早く更新プログラムを適用する方法について でも紹介しています。後者の記事は更新プログラムを主題とするため、本記事ではサイクルの起動方法と名称を参考にしています。

各ステップとログの追跡方法

関連ログ

以下はいずれもクライアント側のログです。既定の保存先は C:\Windows\CCM\logs です。

ログ名 保存場所 (既定) 主な用途
PolicyAgent.log C:\Windows\CCM\logs ポリシーの要求を記録します。今回の抜粋では、ダウンロード、受信したポリシーの評価・適用も確認します。
PolicyEvaluator.log C:\Windows\CCM\logs クライアント上でのポリシー評価を確認します。ポリシー ID とバージョン、評価のタイミングを照合します。
InventoryAgent.log C:\Windows\CCM\logs インベントリ処理の開始、収集条件、レポート生成、送信結果を確認します。
InventoryProvider.log C:\Windows\CCM\logs インベントリ処理の詳細を確認するために併読します。
FileSystemFile.log C:\Windows\CCM\logs ソフトウェア インベントリおよびファイル収集を担当する Windows Management Instrumentation (WMI) プロバイダーの動作を確認します。
CcmMessaging.log C:\Windows\CCM\logs クライアントと MP 間の通信を記録します。今回の抜粋では、レポートのメッセージ ID に対応する配送結果を確認します。

Note

ログがローテーションしている場合は、同名の .lo_ ファイルにも過去の記録が残っていることがあります。.log が最大サイズに達すると .lo_ へコピーされ、その後のローテーションで .lo_ は上書きされます。

掲載する処理と識別子

項目 掲載する値 対応付ける範囲
ポリシー ID とバージョン {POLICY-ID-A}/2、2.00 [PolicyAgent.log] 内のポリシー本体の取得と評価・適用を対応付けます。
インベントリのアクション ID {00000000-0000-0000-0000-000000000002} 初回と差分の両方で [Action=Software] に対応します。個々の実行は検索条件や記録日時も合わせて確認します。
収集対象 (差分の実行例) C:\InventoryTarget\ 配下の *.exe と *.ps1 [InventoryAgent.log] と [FileSystemFile.log] の検索条件を照合します。
レポート種別 (初回の実行例) Full、MajorVersion=1、MinorVersion=0 初回のフル インベントリに記録されたレポート種別とバージョンです。
レポート種別 (差分の実行例) Delta、MajorVersion=1、MinorVersion=1 差分インベントリに記録されたレポート種別とバージョンです。
レポートのメッセージ ID (差分の実行例) {MESSAGE-ID-A} [InventoryAgent.log] の送信結果と [CcmMessaging.log] の配送結果を対応付けます。
配送先 MP mp01.example.com 匿名化した配送先ホスト名です。

[POLICY-ID-A] と [MESSAGE-ID-A] は環境固有の ID を置換した匿名化表記であり、実際の GUID の形式ではありません。サイト コードは「サイト コード」という表記に置換しています。アクション ID とその他の非匿名化部分は原文を維持しています。

表中の [MajorVersion] と [MinorVersion] はインベントリ レポートのバージョンで、クライアントの製品バージョンとは異なります。

ポリシー ID とレポートのメッセージ ID は、それぞれのログ内で処理を追うための別の識別子です。また、[InventoryAgent.log] と [FileSystemFile.log] の収集処理には共通のジョブ ID が記録されていないため、本記事では、同じ検索条件と原本の記録順・日時を手掛かりに対応付けています。ログを見比べる際は、スレッド ID に加えて検索条件や記録日時も合わせて確認すると、処理の流れを追いやすくなります。

ステップ 1 : クライアント ポリシーを取得・評価し、設定を反映する

クライアント設定の変更を反映するには、クライアント ポリシーの取得と評価を確認します。詳細な工程は クライアントのコンピューター ポリシー処理についての動作説明 で紹介しています。

今回の [PolicyAgent.log] では、差分インベントリの実行例に先立って、コンピューター ポリシーの差分更新を受信しています。次の抜粋では、ダウンロード対象のポリシー ID とバージョン 2.00 に対応するファイル名を確認します。

1
2
3
4
5
<![LOG[Requesting Machine policy assignments from authority 'SMS:サイト コード']LOG]!><component="PolicyAgent_RequestAssignments" context="" type="1" thread="9260" file="requestassignmentstask.cpp:1192">
(中略)
<![LOG[Received Machine delta policy update with 2 assignments]LOG]!><component="PolicyAgent_RequestAssignments" context="" type="1" thread="9260" file="replyassignmentsendpoint.cpp:1645">
(中略)
<![LOG[PolicyDownload: <File Source=".sms_pol?{POLICY-ID-A}/2.2_00" Destination="{POLICY-ID-A}-2.2.00.tmp"/>]LOG]!><component="PolicyAgent" context="" type="1" thread="11936" file="policystatemgr.cpp:1491">

同じポリシー ID とバージョンについて、[RequestedConfig] への評価・適用と、その後の設定更新が記録されています。

1
2
3
4
5
<![LOG[Evaluating and applying policy 'CCM_Policy_Policy5.PolicyID="{POLICY-ID-A}/2",PolicyVersion="2.00",PolicySource="SMS:サイト コード"' to '\\.\ROOT\ccm\policy\Machine\RequestedConfig']LOG]!><component="PolicyAgent" context="" type="1" thread="11936" file="policyobject.cpp:570">
(中略)
<![LOG[[PolicyEval] Applied 1 policies successfully.]LOG]!><component="PolicyAgent" context="" type="1" thread="11936" file="policystatemgr.cpp:998">
(中略)
<![LOG[New/Changed ActualConfig policy instance(s) : 1]LOG]!><component="PolicyAgent" context="" type="1" thread="11936" file="policyutil.cpp:6495">

この範囲では、受信したポリシーの評価・適用が成功したことと、[ActualConfig] の新規または変更されたインスタンスが 1 件あったことを確認できます。この抜粋では、設定の具体的な変更内容までは分からないため、実際に使用された収集条件は、後述のクエリで確認します。

[PolicyEvaluator.log] にも同じポリシー ID の評価が記録されていますが、今回のバージョン 2.00 の受信前後に行われた別の評価です。本記事では、受信したバージョンと評価・適用の対応を確認できる [PolicyAgent.log] の記録を例にしています。

設定の反映状況は、ダウンロード結果と、対象のポリシー ID とバージョンに対応する評価・適用結果を合わせて確認すると把握しやすくなります。ポリシー要求や評価の途中で処理が止まっている場合は、[PolicyAgent.log]、[PolicyEvaluator.log]、および [CcmMessaging.log] の該当処理が確認の手掛かりになります。

ステップ 2 : ソフトウェア インベントリを開始し、対象ファイルの情報を収集する

[InventoryAgent.log] では、最初に処理の種類とレポート種別を確認します。他のインベントリ処理も記録されるため、[Action=Software] を手掛かりに、ソフトウェア インベントリの処理を探します。

初回実行時 (フル インベントリ)

[ソフトウェア インベントリ] は、初回に収集対象全体の情報を報告します。提供ログでは、前回のフル レポートがないことを示すメッセージに続いて、[ReportType=Full] が記録されています。

1
2
<![LOG[Inventory: Delta report without a previous Full report; will do a Full report.]LOG]!><component="InventoryAgent" context="" type="1" thread="3592" file="agentstate.cpp:1472">
<![LOG[Inventory: Action=Software, ReportType=Full, MajorVersion=1, MinorVersion=0]LOG]!><component="InventoryAgent" context="" type="1" thread="3592" file="agentstate.cpp:1745">

2 回目以降 (差分インベントリ)

初回の報告後は、通常、前回からの変更分を報告します。後続の実行例では、[ReportType=Delta] が記録されています。

1
2
3
4
<![LOG[Inventory: *********************** Start of message processing. ***********************]LOG]!><component="InventoryAgent" context="" type="1" thread="3592" file="agentendpoint.cpp:422">
(中略)
<![LOG[Inventory: Opening store for action {00000000-0000-0000-0000-000000000002} ...]LOG]!><component="InventoryAgent" context="" type="1" thread="3592" file="datastore.cpp:176">
<![LOG[Inventory: Action=Software, ReportType=Delta, MajorVersion=1, MinorVersion=1]LOG]!><component="InventoryAgent" context="" type="1" thread="3592" file="agentstate.cpp:1745">

収集処理の確認

以降は、差分インベントリの実行例を使って収集処理を確認します。この例では、匿名化後の C:\InventoryTarget\ を対象に、*.exe と *.ps1 のファイル情報を問い合わせています。

1
<![LOG[Collection: Namespace = \\.\root\ccm\invagt; Query = SELECT Name, Path, LastWriteDate, Size, CompanyName, ProductName, ProductVersion, ProductLanguage, FileVersion, FileDescription FROM FileSystemFile WHERE Name = '*.exe|*.ps1' AND Path = 'C:\\InventoryTarget\\*' AND SkipWindirFolders = TRUE AND IsCompressed = FALSE AND IsEncrypted = FALSE; Timeout = 14400 secs.]LOG]!><component="InventoryAgent" context="" type="1" thread="11936" file="filesystemcollectiontask.cpp:479">

収集対象の名前、場所、除外条件が想定どおりかは、このクエリとクライアント設定を照合します。この例の対象パスや拡張子は、すべてのクライアントに共通する既定値ではありません。

[FileSystemFile.log] では、同じ検索条件について、クエリの解析、スキャン、および終了を確認できます。

1
2
3
4
5
6
7
<![LOG[ ************* Start of File System Query. *************]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:161">
<![LOG[Query = SELECT __class, __path, __relpath, name, path, lastwritedate, size, companyname, productname, productversion, productlanguage, fileversion, filedescription FROM FileSystemFile WHERE name = '*.exe|*.ps1' and path = 'c:\\inventorytarget\\*' and skipwindirfolders = true and iscompressed = false and isencrypted = false; Timeout = 14400 secs; ScanInterval = 2 msecs; SkipFile = skpswi.dat]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:342">
<![LOG[Query parsed successfully... ready to scan for files.]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:214">
(中略)
<![LOG[File scan completed; 2 instances reported.]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:248">
<![LOG[File System File: Query completed successfully.]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:171">
<![LOG[ ************* End of File System Query. *************]LOG]!><component="FileSystemFile" context="" type="1" thread="10248" file="filesystemquerytask.cpp:178">

このクエリでは 2 インスタンスが報告され、クエリの成功終了が記録されています。さらに [InventoryAgent.log] では、インベントリ対象のデータ項目の処理結果を確認します。

1
<![LOG[Collection: 1/1 inventory data items successfully inventoried.]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="filesystemcollectiontask.cpp:281">

ここでの「1/1」はインベントリ データ項目の処理結果で、直前のファイル スキャンで報告された「2 インスタンス」とは集計の単位が異なります。各メッセージが示す対象を確認すると、収集結果を把握しやすくなります。

収集が完了しない場合は、[InventoryAgent.log] の対象クエリと結果、[FileSystemFile.log] の同じ検索条件の処理を確認します。必要に応じて [InventoryProvider.log] も併読します。エラー行や警告行に加え、後続の収集結果とレポート生成まで確認すると、サイクル全体の状況を把握しやすくなります。

ステップ 3 : 収集結果からインベントリ レポートを生成する

収集後、[InventoryAgent.log] にレポート生成タスクの開始と結果が記録されます。

1
2
3
<![LOG[Inventory: Starting reporting task.]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="reporttask.cpp:240">
<![LOG[Reporting: 1 report entries created.]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="reporttask.cpp:260">
<![LOG[Inventory: Reporting Task completed in 0.157 seconds]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="agentstate.cpp:1012">

この差分インベントリの実行例では、レポートのエントリが 1 件生成され、レポート生成タスクの完了が記録されています。ファイル スキャンでは 2 インスタンス、差分レポートでは 1 エントリというように、各工程の件数が記録されています。MP への配送結果は、次のステップで確認します。

レポート生成の開始や完了が見つからない場合は、同じインベントリ処理の収集結果から続けて確認します。エントリ数と合わせてレポート種別、タスクの終了結果、および後続の送信結果を確認すると、処理の進行状況を追いやすくなります。

ステップ 4 : レポートを MP へ転送する

[InventoryAgent.log] で、送信先とレポートのメッセージ ID を確認します。この実行では [MP_SinvEndpoint] 宛ての送信結果が記録されています。

1
<![LOG[Inventory: Successfully sent report. Destination:mp:MP_SinvEndpoint, ID: {MESSAGE-ID-A}, Timeout: 80640 minutes MsgMode: Signed, Not Encrypted]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="agentstate.cpp:2311">

次に、[CcmMessaging.log] で同じメッセージ ID を検索します。

1
<![LOG[OutgoingMessage(Queue='mp_mp_sinvendpoint', ID={MESSAGE-ID-A}): Delivered successfully to host 'mp01.example.com'.]LOG]!><component="CcmMessaging" context="" type="1" thread="3592" file="messagequeueproc_outgoing.cpp:1808">

同じ [メッセージ ID] と、配送先ホストへの [Delivered successfully] により、このレポートの MP への配送成功を確認できます。[InventoryAgent.log] にも、今回のインベントリ処理の完了が記録されています。

1
<![LOG[Inventory: Action completed.]LOG]!><component="InventoryAgent" context="" type="1" thread="10248" file="agentstate.cpp:1810">

[InventoryAgent.log] の送信結果や [Action completed.] に加え、[CcmMessaging.log] の同じメッセージ ID に対応する配送結果を確認すると、MP への配送までを追跡できます。配送成功が見つからない場合は、同じ ID に関連するキュー処理と通信結果が確認の手掛かりになります。

クライアント側の [ソフトウェア インベントリ] の動作やログを確認する際に、本記事が参考になれば幸いです。

参考リンク