アプリケーションの互換性

Application Compatibility Toolkit 5.5 の内部

Chris Corio、Chris Jackson

 

概要:

  • Application Compatibility Manager と Agent Framework
  • 互換性エバリュエータ
  • データを格納および分析する
  • Standard User Analyzer
  • Internet Explorer Compatibility Test Tool

目次

Application Compatibility Manager
互換性エバリュエータ
ACT データベース
分析
オンライン同期
Standard User Analyzer
Internet Explorer Compatibility Test Tool
まとめ

Application Compatibility Toolkit (ACT) を使用すると、アプリケーションを展開する前に、それらと Windows の新しいバージョンとの間に互換性があるかどうかを確認するプロセスを管理できます。また、オペレーティング システムの更新がこれらのアプリケーションに与える影響を確認することもできます。これまでに、ACT 5.5 の使用方法について書かれたさまざまな記事やホワイト ペーパーが公開されています。この記事の目的は、ACT 5.5 の内部を紹介し、このツールキットで提供される各ツールのしくみについて説明することです。最初に説明するのは、多くの人がこのツールキットから連想するツールである、Application Compatibility Manager です。

Application Compatibility Manager

Application Compatibility Manager は、運用環境に関する情報を検出し、そのデータを系統的に分析し、テスト プロセスの実施を支援するためのフレームワークを提供します。それでは、しくみを理解するために、このツールについて詳しく見ていきましょう。

エバリュエータ展開パッケージ (MSI) ACT 5.5 データ コレクション パッケージは MSI として展開されますが、MSI について細かく調べれば、このパッケージは実際にはそれほど多くのことを行っていないことがわかります。MSI は、セットアップを実行する実行可能ファイルを抽出します。図 1 は、一般的なセットアップ プロセスを実行するときのプロセス ツリーを示しています。

fig01.gif

図 1 Agent Framework をインストールするときのプロセス ツリー

興味深いのは、赤色で示された、msiexec.exe の 3 番目のインスタンスです。これは元の MSI をアンインストールするための呼び出しです。基本的に、MSI は .exe (図では .tmp ファイルとして示されます) を抽出した後、抽出に使用した MSI をアンインストールします。その後、2 番目の MSI (msiexec によって呼び出されます) がインストールされます。あるテストでは、展開用 MSI のインストールが 1 時 19 分 46 秒に完了し、アンインストールが 1 時 19 分 50 秒に完了しました。この MSI はわずか 4 秒間しかインストールされていなかったようです。したがって、データ コレクション パッケージを展開するときは、MSI がインストールされているかどうかによって、展開先のコンピュータにこの MSI をインストールする必要があるかどうかを判断しないようにしてください。おそらくこの MSI は見つかりません。他の証拠から、各ワークステーションにエージェントがインストールされているかどうかを判断する必要があります。

たとえば、MSI を展開するたびに、展開する MSI 用に製品コードが新しく生成されますが、その MSI によって抽出される MSI には常に同じ製品コード (DC93B45B-D4F5-4FFE-9B47-042BD6FA8CC5) が使用されるので、この製品コードを ACT データ コレクション パッケージがインストールされている証拠として使用できます (ただし、すべての ACT データ コレクション パッケージにこの製品コードが使用されるので、どのパッケージがインストールされているかを特定することは困難です)。この MSI エントリを使用してデータ コレクション パッケージをアンインストールすることはお勧めできません。次に説明する方法を使用して、ACT データ コレクション パッケージをアンインストールすることをお勧めします。

この作業の大部分は、Afsetup.exe によって行われます。エージェントの展開時に問題が発生した場合も、このバイナリを使用することをお勧めします。次のコマンドを使用すると、Agent Framework をアンインストールできます。

%program files%\Microsoft Agent Framework\Agent Framework\afsetup.exe /uninstall

Agent Framework ACT 5.5 Agent Framework は、企業内にある多くのコンピュータからデータを収集するための構造を提供します。エージェントの設計における目標は、ユーザーに意識されることなく動作する、運用環境への展開に適したエージェントを設計することでした。このため、個々のエージェントの処理については、パフォーマンスを最適化することに重点が置かれています (エージェント内で設計に関するいくつかの決定を行うとき、このことに気付くでしょう)。

このフレームワーク自体のしくみは単純明快です。Agent Framework をインストールすると、そのファイルが %program files%\Microsoft Agent Framework に格納されます。Agent Framework は、エージェントのスケジュールと起動を可能にするサービス (actdcsvc.exe) として実行されます。Agent Framework\Data サブディレクトリにある XML は、指定されたスケジュールに従って起動するようエージェントを構成します。エージェントの実行可能ファイルは、Agent Framework\Agents にあります。

エージェントは単なる実行可能ファイルです。Agent Framework サービスは、インストールおよび構成用 XML 内で指定された内容に従って、単純にスケジュールを管理し、適切な実行可能ファイルを起動します。図 2 は、一般的な Agent Framework のインストールにおける最初の 5 分間のプロセス ツリーの例を示しています。

fig02.gif

図 2 Agent Framework のプロセス ツリー

この図には、エージェントのスケジュールを設定して実行する役割のみを果たす単純なサービスが記載されています。実際の作業はこれらのエージェントによって行われます。では、各エージェントについて見ていきましょう。

ACT 5.5 Inventory Agent (collect.exe) は、最も重要なエージェントの 1 つです。基本的に、このエージェントはクライアント システムを検索し、アプリケーションのインベントリを収集します。アプリケーション互換性プロジェクトの計画に必要なデータ (製造元やバージョンから、サポート声明に至るまで、さまざまな情報に合致するアプリケーションの名前) という点では、Inventory Agent は他のソフトウェア インベントリ ツールに比べて、一貫して非常に優れた機能を提供します。

特に便利なのは、このエージェントがシステム内の証拠を適切に検出する (この後説明します) だけでなく、そのデータを次の段階に渡す前に適切に整理することです。このツールは一連の "入れ物" を作成し、この後説明する検索で見つかったすべての証拠を統合し、フラット化します。その後、重複した証拠を削除し、残った証拠を分類します。このエージェントは、アプリケーションを検出するために、さまざまな場所にある証拠を検索します。

MSI データベースの検索では、MsiEnumComponents API を使用して、Windows インストーラによってインストールされたすべてのアプリケーションを列挙します。

[プログラムの追加と削除] の検索では、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Uninstall と HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Uninstall の両方を開き、そこに格納されている各サブキーからデータを検出します。

Windows シェルの検索では、コンピュータ上でプロファイルを持つユーザーごとに、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders と HKEY_USERS\<…>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders の内容を列挙します。その後エージェントは、これらのディレクトリまたはそのサブディレクトリ内にあるすべてのファイルとリンクを検索します (厳密には、デスクトップは不要なファイルの検出を防ぐために除外されます。これは、デスクトップが Web からダウンロードされた実行可能ファイルの "溜まり場" になる傾向があるからです)。この検索では、たとえば [プログラムの追加と削除] に登録されていないが、[スタート] メニューにショートカットが追加されているソフトウェアを検出します。

アプリケーション パスの検索では、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths レジストリ キー内にあるすべてのサブキーを列挙し、プログラム固有のアプリケーション パスを取得している登録済みのアプリケーションをすべて検出します。

パス環境変数の検索では、いずれかのユーザーのパス環境変数で参照されているディレクトリ (サブディレクトリは含みません) ごとに、そこに格納されている実行可能ファイルを検索します。まず、ExpandEnvironmentStrings (システム環境変数と現在のユーザーの環境変数を返します) への呼び出しから返されるパスにある実行可能ファイル、および他のすべてのユーザーの HKEY_USERS\<…>\Environment の内容に含まれるパスにある実行可能ファイルを検索します。これによって、インベントリ コレクタは、単純にファイルをファイル システム内に配置した後、パス環境変数に追加することによってインストールされたアプリケーション (通常はコマンド ライン アプリケーションです) を検出できます。

ファイル拡張子のハンドラの検索では、登録されている各ファイル拡張子を調べ、そのファイル拡張子を処理するよう登録されているプログラムをキャプチャします。まず、HKEY_LOCAL_MACHINE\Software\Classes を開き、ファイル拡張子を示す、ピリオド (.) で始まるエントリを列挙します。エージェントは、検出されたエントリごとにプログラム ID を列挙し、各プログラム ID の shell\open\command サブキーに移動して実行可能ファイルを検出します。その後、ユーザーごとに同じ処理を実行し、HKEY_USERS\<…>\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts の内容を列挙します。これによって、エージェントは、インストール時に単純にバイナリを削除した後、自身をファイル拡張子のハンドラとして登録したソフトウェアを検出できます。

レジストリ Run/RunOnce の検索では、次のレジストリ キーを調べて、アプリケーションを表している可能性がある実行可能ファイルを検出します。

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVerison\RunOnceEx

これらのレジストリ キーを調べることによって、エージェントは、システムの起動時に毎回実行されるが、コレクタによって検出される他の証拠を残していない可能性があるソフトウェアを検出できます。

サービス コントロール マネージャの検索では、サービス コントロール マネージャに (EnumServiceStatus API を使用して) 照会した後、各サービスの詳細を (QueryServiceConfig API を使用して) 照会します。これによって、エージェントは、インストーラを通じて手動で実行可能ファイルをファイル システム上に配置し、サービスを登録するようにレジストリ キーを設定したソフトウェアを検出できます。

Windows コンポーネントの検索では、Windows 用にインストールされているオプション コンポーネントを照会し、それらのアプリケーションをキャプチャします。これは、sysocmgr.inf (%windir%\inf にあります) に照会し、選択されているオプション コンポーネントを列挙することによって行います。これによって、エージェントは、Windows の標準的なインストールに含まれている可能性が低いソフトウェアを検出できます。

互換性エバリュエータ

通常は、企業内のコンピュータにどのようなソフトウェアがインストールされているかが、アプリケーション互換性プロジェクトを進めるうえで最も重要なデータになりますが、Agent Framework を使用すると、エージェントがインストールされているコンピュータからその他のデータを収集することもできます。ACT と共に提供される互換性エバリュエータ エージェントは、運用環境で使用した場合のパフォーマンスを最適化するように設計されているので、収集するデータの量は制限されます。大規模な互換性エバリュエータの展開に重点を置いた投資を行う前に、収集されたデータを見直し、概念実証を行うことによって、データの価値を評価してください。

UAC Compatibility Evaluator UAC Compatibility Evaluator (uacce.exe) は、カスタム shim データベース (uacce.sdb) とカスタム shim (uacdetct.dll) をインストールして、アプリケーションを Windows Vista または Windows 7 上で標準ユーザー (または保護された管理者) として実行できるかどうかを確認します (shim はアプリケーションと Windows の間に挿入される短いアプリケーション コードです。通常は、アプリケーションの互換性に関して Windows 内で発生した問題の解決に使用されますが、ここではそのような問題の検出に使用されます)。このエバリュエータは、explorer.exe 用の互換性レイヤを設定することによって、システム上で実行されているプロセスに shim を適用します。具体的には、カスタム SDB 内で定義されるレイヤである UACCEDetection を含めるように __COMPAT_LAYER 環境変数を設定します。子プロセスはレイヤを継承するので、エクスプローラを使用して作成されるすべてのプロセスに、これらの shim が適用されます。

では、shim はどのような役割を果たすのでしょうか。FileOperations shim は、_lcreat、CopyFile、CopyFileEx、CreateFile、DeleteFile、MoveFile、MoveFileEx、MoveFileWithProgress、ReplaceFile、LZOpenFile、EncryptFile、DecryptFile、および DuplicateEncryptionInfoFile API への呼び出しをインターセプトします。この shim は、呼び出しごとに、ACL によってアクセスが制限されているかどうか、またはファイルが特定のパスにあるかどうか (ACL の制限が緩和されている場合) を確認します。

ACL の確認は、既存の ACL を取得し、"管理者" ACE および特権を削除した後、リソースに対して AccessCheck を呼び出し、管理者以外のユーザーがそのリソースにアクセスできるかどうかを確認することによって行われます。また、ファイルが特定のパスにあるかどうかの確認は、ファイルのパスがルート ディレクトリ、%program files% ディレクトリ、%system% ディレクトリ、または %windows% ディレクトリ内にあるかどうかを確認することによって行われます。失敗はすべて記録されます。

RegistryOperations shim は、RegCreateKey、RegCreateKeyEx、RegDeleteKey、RegDeleteKeyEx、RegDeleteValue、RegOpenCurrentUser、RegOpenKey、RegOpenKeyEx、RegCloseKey、RegOpenUserClassesRoot、RegReplaceKey、RegRestoreKey、RegSetValue、RegSetValueEx、および RegUnloadKey API への呼び出しをインターセプトします。この shim は、インターセプトした API への呼び出しごとに、標準ユーザーからのアクセスが ACL によって拒否されるかどうかを確認します。この ACL の確認は、ファイル操作の場合と同じ方法で行われます。つまり、トークンから余分な権限を削除し、AccessCheck を呼び出します。失敗は記録されます。

ProfileOperations shim は、WritePrivateProfileSection、WritePrivateProfileString、WritePrivateProfileStruct、WriteProfileSection、および WriteProfileString API への呼び出しをインターセプトします。この shim は、これらの API への呼び出しごとに、ini ファイルが ini ファイルのマッピングを使用してマップされているかどうかを確認します。マップされていない場合は、FileOperations shim と同じ方法で、そのファイルに対するアクセス許可を確認します (ini ファイルはマップされなければ単なる別のファイルになるからです)。失敗は記録されます。

RestrictedNamespace shim は、CreateFileMapping API への呼び出しをインターセプトします。オブジェクト名に Global\ または Session\ 名前空間が含まれている場合、失敗が記録されます。

ElevatedRunLevel shim は、CreateProcess、CreateProcessAsUser、CreateProcessWithLogon、および CreateProcessWithToken API への呼び出しをインターセプトします。インターセプトしたすべての API は、対象の実行可能ファイルを調べて、Windows のインストーラ検出機能によって昇格イベント (CreateProcess API の使用時に ERROR_ELEVATION_REQUIRED を返します) がトリガされるかどうかを確認します。また、この shim は、ユーザーの資格情報を変更する API の対象となる ID を調べて、それらが管理者アカウントであるかどうかを確認します。

検出のしくみを詳しく知ると、ある前提に気付きます。それは、エージェントの実行中に、昇格した権限でシステムが実行されていることです。エージェントは、運用システム上で使用することを目的としているので、アプリケーションが既に実行されていることが前提になります。アプリケーションが実行されていて、UAC に関する問題が発生する場合は、おそらく管理者としてシステムを実行しています。

Windows Vista/Windows 7 Compatibility Evaluator Windows Vista/Windows 7 Compatibility Evaluator は、実際は 2 つのエージェント実行可能ファイルに分かれています。これは、静的に検出できる作業単位と、実行時に監視および分析する作業単位があるからです。

GINA Session 0 Agent (ginasession0.exe) は、レジストリの簡単な確認を行います。このエージェントは、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL を調べて、カスタム GINA がインストールされているかどうかを確認します。また、サービスを列挙し、レジストリ内の種類の値を調べて、0x100 ビットが設定されている (SERVICE_INTERACTIVE_PROCESS フラグ) かどうかを確認します。失敗はすべて記録されます。

UAC Compatibility Evaluator とよく似ている Deprecation Agent (dep.exe) は、カスタム shim データベース (dep.sdb。Windows 2000 の場合は win2kagents.sdb) とカスタム shim (depdetct.dll) をインストールし、DeprecationAgentLayer を含めるように Explorer.exe の __COMPAT_LAYER 環境変数を設定します。これにより、エクスプローラを通じて起動されるすべてのプロセスに shim が適用されます (shim データベースは、特定のバイナリを shim から除外します。除外されるのは、shim が適用されたことを検出した場合に失敗することが確認されているバイナリです)。

では、この廃止エージェントは何を検索するのでしょうか。このエージェントが使用する shim について見ていきましょう。

DllLoadOperations shim は、LoadLibrary と LoadLibraryEx をインターセプトし、廃止された DLL の一覧に渡されるライブラリ名を比較します。この一覧は、%program files%\Microsoft Agent Framework\Agent Framework\Agents\DEP にある DepManifest.csv に格納されます。使用されるのは、先頭の列が DllType のエントリです。

ExeLoadOperations shim は、CreateProcess、CreateProcessAsUser、CreateProcessWithLogon、CreateProcessWithToken、ShellExecute、ShellExecuteEx、および WinExec API をインターセプトし、廃止された EXE の一覧に渡される実行可能ファイル名を比較します。この一覧も DepManifest.csv に格納され、先頭の列は ExeType です。

RegistryLoadOperations shim は、RegCreateKey、RegCreateKeyEx、RegCloseKey、RegDeleteKey、RegDeleteKeyEx、RegDeleteValue、RegOpenCurrentUser、RegOpenKey、RegOpenKeyEx、RegOpenUserClassesRoot、RegReplaceKey、RegRestoreKey、RegSetValue、RegSetValueEx、および RegUnloadKey API をインターセプトし、一覧に渡されるレジストリ キーを比較します。この一覧も DepManifest.csv に格納され、先頭の列は RegType です。

ApiLoadOperations shim は、廃止された特定の API に直接 shim を適用し、アプリケーションがその API を呼び出したことを記録します。Windows Vista の場合、このような API は sti.dll の StiCreateInstanceA のみです (これにまつわる裏話が公開されています。詳細については、https://blogs.msdn.com/tomarcher/archive/2006/03/22/windows-vista-sti-and-a-story-about-customer-service.aspx を参照してください)。

このエージェントについて 1 つ気付くことがあります。それは、このエージェントが下位レベルでの実行に依存することです。つまり、何かを呼び出したという情報は、その呼び出しが成功した場合のみ記録されます。

Update Compatibility Evaluator Update Compatibility Evaluator を使用すると、特定のアプリケーションが使用している Windows バイナリを確認できるので、Windows Update で更新プログラムがリリースされたときに、実施するテストの対象をより正確に特定できるようになります。Update Compatibility Evaluator の動作は、あるカーネル モード ドライバ (fdrtrace.sys) をインストールすることによって実現されます。このドライバは、アプリケーションによって生成されるファイル システム操作とレジストリ操作を記録するためのファイル システム フィルタ ドライバとレジストリ フックを実装します。このエバリュエータは、サービス (uiaservice.exe) と実行可能ファイル (uiaconvert.exe) を活用してデータを解釈し、そのデータを Windows バイナリへのアクセスとアプリケーションに合わせて調整します。

Bucketizer Agent Bucketizer Agent は、コンピュータのインベントリに対して互換性エバリュエータから収集されたデータをマップし、各アプリケーションについて検出された問題を分類します。

Compressor Agent Compressor Agent (compressor.exe) の目的は、その名前のとおり (Compressor Agent: 圧縮エージェント)、指定されたファイル共有にアップロードするファイルを圧縮して、ネットワーク帯域幅を節約することです。

Uploader Agent Uploader Agent は、他のエージェントから収集したデータを、指定されたファイル共有にアップロードします。このエージェントが行う処理は比較的単純で、ローカルで収集したデータを、指定された場所にコピーします。指定された場所にアクセスできない場合は、5 秒間待機してから再試行します。この再試行は 3 回まで行われます。

ACT 5.5 で提供される重要な新機能は、データ コレクション パッケージに "タグを付ける" ことができる機能です。つまり、特定のデータ コレクション パッケージによってアップロードされるすべてのログに特定のタグが適用されるように、データ コレクション パッケージを構成できます。これによって、インベントリの実行対象グループごとに、どのソフトウェアが使用されているかを完全に把握する必要がある (以前は、アプリケーションが重複している場合、このような特定作業は困難でした) 場合や、複数のグループや組織から収集したデータを統合する場合など、いくつかのシナリオにより効率的に対処できるようになります。

Log Processing Service Log Processing Service は、actdcsvc.exe をサービスとして実行します。聞き覚えがあると思ったかもしれませんが、まさにそのとおりです。これは先ほど説明した Agent Framework サービスです。ここでは、このサービスは次の 3 つのエージェントを実行します。

  • Decompressor Agent (decompressor.exe) は、収集元のワークステーション上で使用される Compressor Agent と対になるエージェントです。このエージェントは、クライアント上で生成された XML ファイルを、それらのアップロードに使用された CAB ファイルから抽出します。XML ファイルの抽出が完了すると、Listener Agent がその変更を検出し、次の処理を行います。
  • Listener Agent (listener.exe) は、指定されたディレクトリの変更を監視します。監視対象のディレクトリ内で変更が発生するまで待機し、変更が発生したら、RPC 呼び出しを Queuer Agent に送信することによって、その変更を処理します。
  • Queuer Agent (queuer.exe) は、Listener Agent からの RPC 呼び出しをリッスンするようにポートを構成します。RPC 呼び出しを受信したら、ファイルを処理してデータベースにアップロードします。処理が成功した場合、Queuer Agent は、処理後の XML ファイルをルート フォルダまたは圧縮されていないフォルダから Processed フォルダに移動します。処理が失敗した場合は、ファイルを Failed フォルダに移動します。非常によくあることですが、ログの処理に失敗した場合、単純にそのファイルを監視対象の共有のルート ディレクトリに戻し、再度処理を試行すると成功します。

非常によく話題になるのは、このような処理後のファイルを保存する必要があるかどうかです。データは既にデータベース内に格納されているので、理論的にはそれらを保存する必要はなく、ほとんどの場合、削除しても問題ありません。ただし、このようなファイルは、データベースを再構築したり、2 つのデータベースを統合するときに役立つ場合があるので、このデータを削除する前に、今後データベースを再生成する必要が生じるかどうかを検討する価値はあります。

ACT データベース

ほとんどの処理は Application Compatibility Manager で行われますが、データはすべて ACT データベースに格納されます。ACT データベースには、さまざまなテーブルが格納されます。スキーマの内容は文書化されていませんが、非常に単純です (ただし、悲しいかな、ACT の新しいリリースが提供されるたびに、ほぼ必ず変更されます)。重要なテーブルには、Applications、Machines、Devices、Issues などがあり、これらはさまざまなエージェントから返されるすべての情報を整理するために使用され、Log Processing Service によって処理されます。

アプリケーションは、一意のアプリケーション ID によってデータに関連付けられます。この ID は、アプリケーションの名前、バージョン、製造元、および言語 (NVVL) を使用して生成されます。

ACT データベースは、Express バージョンを含め、Microsoft SQL Server 2005 以降でホストできます (SQL Server 2000 はサポートされません)。Application Compatibility Manager は、ACT の企業向け構成手順における最初の段階でデータベースを作成します。このデータベースの作成に使用されるスクリプトは、%allusersprofile%\Microsoft\Application Compatibility Toolkit 5\CreateDB.sql にあります。

ACM の重要な側面の 1 つは、レポートを作成する機能です。レポートの作成は、ACM 内でクエリ ビルダ コントロールを使用して ACT データベースをフィルタ処理することによって行います。このコントロールは、[Toggle Filter] (フィルタの切り替え) をクリックすると表示されます。フィルタ処理は、ACT データベース内のエンティティに関連付けられた条件に基づいて行うことができ、条件句を連結して AND および OR リレーションシップを作成することもできます。レポートは、使用するフィルタを定義する .xml ファイルである .adq ファイルとして保存できます。.adq ファイルは、データを格納せず、特定のデータ セットに依存しない、移植性に優れた形式のファイルです。

オンライン同期

オンライン同期を実行するとき、ACT はパブリック Web サービスを使用します。ACT の以前のバージョンでは、すべてのソフトウェアに割り当てられた一意のアプリケーション ID が送信されましたが、必要に応じて、互換性の評価をコミュニティに公開しないようにすることができました。ACT 5.5 では、アプリケーションに関する情報を共有しないことを選択した場合、ACT によってアプリケーション ID が送信されることはありません (これは、その ID に対して返されるデータも受信しないことを意味します)。

このコミュニティのデータは、Microsoft Compatibility Exchange データベースから返され、ロゴ認定のデータとコミュニティのデータ (他のユーザーによる投票の内容) を含みます。現在、windows.com/compatibility は独立したシステムで管理されていて、このデータによって、手動で行われた調査の結果が、市販ソフトウェアの互換性の状態に加味されます。ACT 5.5 は、このコミュニティのデータが初めて組み込まれる ACT のリリースとして、互換性の既知の状態に関して、以前よりもはるかに詳しい情報を提供します。

Standard User Analyzer

Standard User Analyzer (SUA) は、アプリケーションの実行を監視および分析し、アプリケーションのテスト中に見つかった問題を伝達するためのいくつかのバイナリから構成されます。SUA のメイン UI では、特定のアプリケーションを指定し、そのアプリケーションの起動条件を分析および選択できます。その後 SUA は、基盤となるプラットフォームとして Application Verifier を使用し、アプリケーションを監視します。アプリケーションの実行を監視した後、SUA は、取得したデータを SUA の UI 内で提供します。ユーザーはこの UI を使用して、データを理解したり、調整パッケージを作成して Windows アプリケーション互換性インフラストラクチャに組み込むことができます。

Application Verifier Application Verifier は、アプリケーションの実行を監視する方法を開発者に提供するツールです。SUA は、Application Verifier を使用して、管理者特権を要求する可能性があるアプリケーション動作を追跡します。これは、特定の API をフックし、それらの使用状況を監視することによって行います。

Application Verifier はプラグイン モデル (この記事の執筆時点では、まだ一般向けに文書化されていません) を実装するので、特定の DLL を登録および使用して、対象のアプリケーションを監視できます (プラグインは、レジストリ キー KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\{ApplicationVerifierGlobalSettings} を使用して構成されます)。SUA がアプリケーションの監視に使用する DLL は、インストール中に %windir%\System32 ディレクトリにインストールされる vfLuaPriv2.dll です。vfLuaPriv2.dll バイナリは、Application Verifier によってインストールされる vfLuaPriv.dll よりも優先されます。

SUA は、テスト対象のアプリケーションを起動するとき、まずシステムに Application Verifier がインストールされているかどうかを確認し、必要に応じて、このツールをインストールするようユーザーに要求します。次に、SUA は Application Verifier のコマンド ライン インターフェイスを使用してアプリケーションを登録します。たとえば、監視対象が notepad.exe の場合は、次のようなコマンド ラインを呼び出します。

appverif.exe -enable luapriv -for "notepad.exe"

Application Verifier は、文字列 luapriv を、vfLuaPriv2.dll 内で指定されている名前と照合します。

また、SUA は、アプリケーションを構成するときに、そのアプリケーションによって作成されるすべての子プロセスを監視するよう Application Verifier に指示します。Application Verifier は、プロセスごとに個別のログ ファイルを作成しますが、SUA はこれらのログ ファイルを組み合わせて、統合された単一のレポートを作成します。SUA は、ログのコレクションを、他のコンピュータ上で参照できるように .cab ファイルに保存することもできます。

Standard User Analyzer の UI SUA は、3 つの異なる状況でアプリケーションをテストできます。これらは、アプリケーションを起動するときに、現在のユーザーのトークンを使用する状況、現在のユーザーのトークンを使用し、ファイルとレジストリの仮想化を無効にする状況、および昇格した特権を使用する状況です。どの状況でも、SUA は昇格した SUAnalyzerSrv.exe プロセスを起動します。これは、Application Verifier を構成するには昇格した特権が必要だからです。図 3 は、notepad.exe をテストするときの一般的なプロセス ツリーを示しています。

fig03.gif

図 3 Notepad.exe のテスト

SUAnalyzerSrv.exe と AppVerif.exe は、常に管理者特権を使用して実行され、対象のアプリケーションのテスト環境を準備します。その後 SUA は、指定されたセキュリティ コンテキストで notepad.exe を起動し、アプリケーションとそのすべての子プロセスが実行を完了するまで待機します。完了後、SUA は Application Verifier のログを集計および処理し、結果を UI 内に表示します。

SUA の結果は、File (ファイル)、Registry (レジストリ)、INI、Token (トークン)、Privilege (特権)、Name Space (名前空間)、Other Objects (その他のオブジェクト)、Process (プロセス) といった問題のカテゴリに分類されます。これらのカテゴリは、SUA の UI の最上部にあるタブに対応しているので、アプリケーションをテストしながら、さまざまな問題を確認できます。

[File] (ファイル) タブと [Registry] (レジストリ) タブには、管理者特権を要求する可能性があるファイル システム操作とレジストリ操作が表示されます。luapriv Application Verifier プラグインは、CreateFile や CreateRegistryKey などの関連する API の動作を監視し、管理者特権を要求する場合があるかどうかを確認します。Windows Vista では、UAC のファイルとレジストリのリダイレクト機能によって、このような操作が可能になる場合があります。

通常、UI 内のタブには、luapriv が一連の API の動作を監視した結果が表示されます。たとえば、[INI] タブは、もともと 16 ビット アプリケーションで使用されていた WriteProfile API の使用に関する問題を検出することに重点を置いています。各タブに関する説明は、SUA のインストールに含まれる SUAnalyzer.rtf ドキュメントに記載されています。各タブの下にあるイベントを展開すると、アプリケーション内でイベントが発生した時点のスタック トレースなど、イベントの詳細情報を参照できます。

アプリケーションのテスト結果を確認した後、SUA を使用して、そのアプリケーション用の調整パッケージをテストおよび作成できます。調整パッケージは、システムにアプリケーション互換性データベースを登録する MSI で、SUA に付属しているユーティリティである loosen.exe を使用して、ファイルやレジストリの ACL を調整します。この調整パッケージは、環境全体に展開できます。

Internet Explorer Compatibility Test Tool

Internet Explorer Compatibility Test Tool の動作は、Internet Explorer Compatibility Evaluator (iece.exe) を有効にすることによって実現されます。ACT 5.0 では、データ コレクション パッケージの一部としてこのエバリュエータを展開できました。ただし、コレクションを使用するには、対象のブラウザが既にインストールされている必要があったので、ACT 5.5 ではこのエバリュエータは削除されました (インストールされてから動作しないことがわかるのでは、最適とは言えません。多くのユーザーは、新しいブラウザをインストールする前に問題が見つかった方がよいと考えるでしょう)。

Internet Explorer Compatibility Evaluator の役割は非常に単純で、実行する処理は、Internet Explorer でログ記録を有効にするようレジストリを変更することのみです。ブラウザ自体が検出機能を提供するので、データの正確性は非常に高くなります。Internet Explorer が検出できるすべてのイベントの詳細 (およびイベントごとの推奨される修復方法) については、「Internet Explorer のアプリケーションの互換性」を参照してください。

Internet Explorer が情報をイベント ログに記録すると、テスト ツールがレジストリから情報を収集し、それを統合します。この情報をツール内で直接分析することも、統合された ACT データベースにイベントをアップロードすることもできます。イベントを ACT データベースにアップロードすることを選択すると、Internet Explorer Compatibility Evaluator は、データ コレクション パッケージ内のエージェントを実行する場合と同じように、エージェントを実行します。具体的には、collect.exe、bucketizer.exe、compressor.exe の順に実行した後、CAB ファイルの保存先を指定するよう要求します。

まとめ

これで、Application Compatibility Toolkit 5.5 の内部に潜入する今回のツアーは終わりです。この製品では、Windows Vista や Windows 7 への移行に役立つさまざまなツールが提供されます。各ツールについてより詳しく理解することによって、各ツールの可能性をより正しく評価し、適切にそれらへの投資を行うことができるようになります。

Chris Jackson は、Windows Application Experience SWAT チームのテクニカル リードです。Chris は、世界中の企業顧客に対して、それらの企業がアプリケーションの互換性に関して抱える問題の調査とその調整作業をサポートするだけでなく、業界の多くのイベントで、Windows アプリケーションの互換性に関する教育トレーニングを行っています。https://blogs.msdn.com/cjacks から彼に連絡を取ることができます。

Chris Corio は、5 年以上にわたりマイクロソフトの Windows セキュリティ チームに所属していました。マイクロソフトでは、主にアプリケーションのセキュリティに関するテクノロジと、Windows をセキュリティで保護するための管理テクノロジを担当していました。連絡先は winsecurity@chriscorio.com (英語のみ) です。