다음을 통해 공유


리소스 교체 검색

WRP(Windows Resource Protection)는 Windows Vista 또는 Windows Server 2008의 일부로 설치된 필수 시스템 파일, 폴더 및 레지스트리 키를 대체하지 못하도록 방지합니다.

WRP는 보호된 리소스를 교체하려는 시도를 감지하고 방지하여 Windows Vista 또는 Windows Server 2008의 파일, 폴더 및 레지스트리 키를 보호합니다. 이 보호는 보호된 리소스에 대해 정의된 Windows DACL(임의 액세스 제어 목록) 및 ACL(액세스 제어 목록)을 기반으로 합니다. WRP로 보호되는 리소스를 수정하기 위한 모든 액세스 권한은 TrustedInstaller로 제한됩니다. WRP로 보호되는 리소스는 Windows 모듈 설치 관리자 서비스와 함께 지원되는 리소스 대체 메커니즘 을 사용하여만 변경할 수 있습니다. WRP로 보호되는 리소스를 수정하려는 애플리케이션은 리소스를 변경하지 않으며 리소스에 대한 액세스가 거부되었다는 오류 메시지를 받을 수 있습니다.

애플리케이션 및 설치 관리자는 SfcIsFileProtectedSfcIsKeyProtected 함수를 사용하여 파일 또는 레지스트리 키가 보호되는지 여부를 확인할 수 있습니다.

**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());
   }

}