다음을 통해 공유


리소스 교체 탐지

WRP(Windows 리소스 보호)는 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: **

WFP(Windows 파일 보호)는 보호된 시스템 파일을 바꾸려는 시도를 감지하여 시스템 파일을 보호합니다. 이 보호는 WFP가 보호된 디렉터리의 파일에 대한 디렉터리 변경 알림을 받은 후에 트리거됩니다. WFP는 이 알림을 받으면 변경된 파일을 결정합니다. 파일이 보호된 경우 WFP는 카탈로그 파일에서 파일 서명을 조회하여 새 파일이 올바른 버전인지 확인합니다. 파일 버전이 올바르지 않은 경우 시스템은 파일이 캐시에 있는지 여부에 따라 캐시 또는 배포 미디어에서 올바른 버전으로 파일을 바꿉니다. WFP는 다음 순서로 올바른 파일을 검색합니다.

  1. 캐시 디렉터리를 검색합니다.
  2. 네트워크 설치를 사용하여 시스템을 설치한 경우 네트워크 설치 경로를 검색합니다.
  3. 시스템이 CD-ROM에서 설치된 경우 Windows CD-ROM에서 검색합니다.

WFP가 처음 두 위치에서 파일을 자동으로 찾을 수 없는 경우 다음 메시지가 표시됩니다.

캐시 디렉터리 또는 네트워크 설치 경로wfp 메시지

CD-ROM을 사용하여 시스템을 설치한 경우 WFP는 다음 메시지를 표시합니다.

사용자에게 Windows 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());
   }

}