检测资源替换

Windows 资源保护 (WRP) 阻止替换作为 Windows Vista 或 Windows Server 2008 的一部分安装的基本系统文件、文件夹和注册表项。

WRP 通过检测和阻止尝试替换受保护资源来保护 Windows Vista 或 Windows Server 2008 上的文件、文件夹和注册表项。 此保护基于 Windows 自由访问控制列表 (DACL) 和为受保护资源定义的 ACL) (访问控制列表。 修改受 WRP 保护的资源的完全访问权限仅限于 TrustedInstaller。 只能通过 Windows 模块安装程序服务使用 支持的资源替换机制 来更改受 WRP 保护的资源。 尝试修改受 WRP 保护的资源的应用程序永远不会更改资源,并且可能会收到一条错误消息,指出对资源的访问被拒绝。

应用程序和安装程序可以使用 SfcIsFileProtectedSfcIsKeyProtected 函数来确定文件或注册表项是否受保护。

**Windows Server 2003 和 Windows XP:**

Windows 文件保护 (WFP) 通过检测替换受保护系统文件的尝试来保护系统文件。 WFP 收到受保护目录中文件的目录更改通知后,将触发此保护。 WFP 收到此通知时,它将确定哪个文件发生了更改。 如果文件受保护,WFP 将在目录文件中查找文件签名,以确定新文件是否为正确版本。 如果文件版本不正确,系统会将文件替换为缓存或分发媒体中的正确版本,具体取决于文件是否位于缓存中。 WFP 按以下顺序搜索正确的文件:

  1. 搜索缓存目录。
  2. 如果系统是使用网络安装安装的,请搜索网络安装路径。
  3. 在 Windows CD-ROM 上搜索系统(如果系统是从 CD-ROM 安装的)。

如果 WFP 无法在前两个位置自动找到该文件,则会显示以下消息:

在缓存目录或网络安装路径中找不到文件时显示 wfp 消息

如果系统是使用 CD-ROM 安装的,则 WFP 将显示以下消息:

显示 wfp 消息以提示用户插入 Windows cd-rom

如果管理员未登录,则 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());
   }

}