检测资源替换
Windows 资源保护 (WRP) 阻止替换作为 Windows Vista 或 Windows Server 2008 的一部分安装的基本系统文件、文件夹和注册表项。
WRP 通过检测和阻止尝试替换受保护资源来保护 Windows Vista 或 Windows Server 2008 上的文件、文件夹和注册表项。 此保护基于 Windows 自由访问控制列表 (DACL) 和为受保护资源定义的 ACL) (访问控制列表。 修改受 WRP 保护的资源的完全访问权限仅限于 TrustedInstaller。 只能通过 Windows 模块安装程序服务使用 支持的资源替换机制 来更改受 WRP 保护的资源。 尝试修改受 WRP 保护的资源的应用程序永远不会更改资源,并且可能会收到一条错误消息,指出对资源的访问被拒绝。
应用程序和安装程序可以使用 SfcIsFileProtected 和 SfcIsKeyProtected 函数来确定文件或注册表项是否受保护。
**Windows Server 2003 和 Windows XP:**
Windows 文件保护 (WFP) 通过检测替换受保护系统文件的尝试来保护系统文件。 WFP 收到受保护目录中文件的目录更改通知后,将触发此保护。 WFP 收到此通知时,它将确定哪个文件发生了更改。 如果文件受保护,WFP 将在目录文件中查找文件签名,以确定新文件是否为正确版本。 如果文件版本不正确,系统会将文件替换为缓存或分发媒体中的正确版本,具体取决于文件是否位于缓存中。 WFP 按以下顺序搜索正确的文件:
- 搜索缓存目录。
- 如果系统是使用网络安装安装的,请搜索网络安装路径。
- 在 Windows CD-ROM 上搜索系统(如果系统是从 CD-ROM 安装的)。
如果 WFP 无法在前两个位置自动找到该文件,则会显示以下消息:
如果系统是使用 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());
}
}