リソースの置換の検出
Windows Resource Protection (WRP) を使用すると、Windows Vista または Windows Server 2008 の一部としてインストールされる重要なシステム ファイル、フォルダー、レジストリ キーを置き換えなくなります。
WRP は、保護されたリソースを検出して置き換えようとしないようにすることで、Windows Vista または Windows Server 2008 上のファイル、フォルダー、レジストリ キーを保護します。 この保護は、保護されたリソースに対して定義された Windows 随意アクセス制御リスト (DACL) とアクセス制御リスト (ACL) に基づいています。 WRP で保護されたリソースを変更するためのフル アクセスのアクセス許可は、TrustedInstaller に制限されます。 WRP で保護されたリソースは、Windows モジュール インストーラー サービスで サポートされているリソース置換メカニズム を使用してのみ変更できます。 WRP で保護されたリソースを変更しようとするアプリケーションは、リソースを変更せず、リソースへのアクセスが拒否されたことを示すエラー メッセージを受け取る可能性があります。
アプリケーションとインストーラーは 、SfcIsFileProtected 関数と SfcIsKeyProtected 関数を使用して、ファイルまたはレジストリ キーが保護されているかどうかを判断できます。
**Windows Server 2003 および Windows XP: **
Windows File Protection (WFP) は、保護されたシステム ファイルの置換の試行を検出することで、システム ファイルを保護します。 この保護は、保護されたディレクトリ内のファイルのディレクトリ変更通知を WFP が受け取った後にトリガーされます。 WFP は、この通知を受け取ると、どのファイルが変更されたかを判断します。 ファイルが保護されている場合、WFP はカタログ ファイル内のファイル署名を検索して、新しいファイルが正しいバージョンであるかどうかを判断します。 ファイルのバージョンが正しくない場合、ファイルがキャッシュ内にあるかどうかに応じて、システムによってファイルがキャッシュまたは配布メディアの正しいバージョンに置き換えられます。 WFP は、次の順序で正しいファイルを検索します。
- キャッシュ ディレクトリを検索します。
- ネットワーク インストールを使用してシステムがインストールされている場合は、ネットワーク インストール パスを検索します。
- システムが CD-ROM からインストールされている場合は、Windows CD-ROM で検索します。
WFP が最初の 2 つの場所でファイルを自動的に見つけられない場合は、次のメッセージが表示されます。
システムが CD-ROM を使用してインストールされた場合、WFP は次のメッセージを表示します。
管理者がログオンしていない場合、WFP はどちらのダイアログ ボックスも表示できません。 管理者がログオンすると、WFP によってダイアログ ボックスが表示されます。
WFP では、ファイル置換の試行もシステム イベント ログに記録されます。 管理者が正しいファイルの復元を取り消した場合、WFP は取り消しをログに記録します。
保護されたファイルの一覧の取得
次の例は、アプリケーションとインストーラーが SfcGetNextProtectedFile 関数を使用して、保護されたファイルの完全な一覧を取得する方法を示しています。
#include <windows.h>
#include <sfc.h>
#include <stdio.h>
#pragma comment(lib, "sfc")
void wmain (int argc, WCHAR ** argv)
{ UNREFERENCED_PARAMETER(argc);
PROTECTED_FILE_DATA pfd = {0};
BOOL fResult;
wprintf (L"List of protected files:\n\n", argv[1]);
while (FALSE != (fResult = SfcGetNextProtectedFile (NULL, &pfd)))
{
wprintf (L" %lu %s\n", pfd.FileNumber, pfd.FileName);
}
if (GetLastError() == ERROR_NO_MORE_FILES)
{
wprintf (L"\nAll %lu protected files listed\n", pfd.FileNumber);
}
else
{
wprintf (L"\nerror %lu: SfcGetNextProtectedFile() failed unexpectedly\n", GetLastError());
}
}