윈도우 레지스트리

**윈도우 레지스트리**(Windows Registry)는 마이크로소프트 윈도우 32/64비트 버전과 윈도우 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스로, 모든 하드웨어, 운영 체제 소프트웨어, 대부분의 비운영 체제 소프트웨어, 사용자 PC 선호도 등에 대한 정보와 설정이 들어있다. 사용자가 제어판 설정, 파일 연결, 시스템 정책, 또는 설치된 소프트웨어를 변경하면 이에 따른 변경 사항들이 레지스트리에 반영되어 저장된다. 레지스트리는 또한 성능 카운터와 현재 사용하고 있는 하드웨어와 같은 런타임 정보를 노출하면서 윈도우를 커널의 운영 체제 안에 제공한다.

이전에 윈도우 프로그램에 대한 구성 설정을 담는 데에는 각 프로그램마다 INI 파일이 사용되었다. 이러한 파일들이 시스템 여러 곳에 퍼짐으로써 찾기가 쉽지 않았었는데, 이러한 연유로 윈도우 레지스트리가 도입된 것이다.

## 구조
### 키, 값
레지스트리는 키와 값이라는 두 가지 기본 요소를 포함하고 있다.

레지스트리 **키**는 폴더와 비슷하다. - 값과 더불어, 각 키는 (수많은 서브키를 포함할 수 있는) 서브키를 가질 수 있다. 키는 계급 수준을 지시하기 위해 백슬래시를 사용하면서 Windows라는 경로 이름과 비슷한 구문으로 가리킨다. 이를테면 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows는 "HKEY_LOCAL_MACHINE" 키의 "Software" 서브키의 "Microsoft" 서브키의 "Windows"라는 서브키를 가리킨다.

레지스트리 **값**은 키 안에 들어 있는 이름/자료이다. 값은 여러 키로부터 따로 참조할 수 있다. 값 이름은 백슬래시를 포함할 수 있지만, 백슬래시를 사용하면 키 경로와 구별하는 것이 어렵게 될 수 있다. 레지스트리 값을 찾아서 이용하는 윈도우 API 명령어는 부모 키를 정의하는 핸들과 값 이름을 키 경로로부터 별도로 가져온다.

수많은 다른 종류의 값이 있다.

### 하이브
레지스트리는 수많은 논리를 구분하는 "하이브"(hive)로 나눌 수 있다. 하이브는 모두 HKEY로 시작하며, 윈도우 API 정의로 이름이 지정되어 있는 것이 보통이다. HK로 시작하는 이 이름들은 HKCU, HKLM과 같이 짧은 3~4개의 이름을 줄인 것이다.

HKEY_LOCAL_MACHINE과 HKEY_CURRENT_USER 노드는 서로 비슷한 구조를 가지고 있다. 응용 프로그램은 보통 "HKEY_CURRENT_USER\Software\제조업체 이름\응용 프로그램 이름\버전 번호\설정 이름"의 설정 항목을 검색하고 설정값을 찾지 못할 경우 HKEY_LOCAL_MACHINE 키의 같은 위치에서 다시 한 번 검색한다. 또, HKEY_LOCAL_MACHINE을 먼저 기록하지만 (로그온한 사용자가 관리자가 아닌 경우 등에 따라) 기록하지 못하는 경우, 설정값은 HKEY_CURRENT_USER에 대신 저장한다.

하이브의 종류는 다음과 같다.
* HKEY_CLASSES_ROOT (HKCR): 파일 연결, OLE 객체 클래스 ID와 같은 등록된 응용 프로그램의 정보를 담고 있다. 윈도우 2000 이후로, HKCR은 HKCU\Software\Classes와 HKLM\Software\Classes를 편집한다. 주어진 값이 위의 서브키의 두 곳에 존재하면, HKCU\Software\Classes의 항목을 사용한다.
* HKEY_CURRENT_USER (HKCU): 현재 로그인한 사용자의 설정을 담고 있다.
* HKEY_LOCAL_MACHINE (HKLM): 컴퓨터의 모든 사용자의 설정을 담고 있다.
* HKEY_USERS (HKU): 컴퓨터에서 사용 중인 각 사용자 프로파일에 대한 HKEY_CURRENT_USER 키에 일치하는 서브키를 담고 있다.
* HKEY_CURRENT_CONFIG: 실행 시간에 수집한 자료를 담고 있다. 이 키에 저장된 정보는 디스크에 영구적으로 저장되지 않고 시동 시간에 생성된다.
* HKEY_PERFORMANCE_DATA: 런타임 성능 데이터 정보를 제공한다. 이 키는 레지스트리 편집기에 보이지 않지만 윈도우 API의 레지스트리 명령어를 통해 볼 수 있다.
* HKEY_DYN_DATA: 이 키는 윈도우 95, 윈도우 98, 윈도우 Me에만 쓰인다. 플러그 앤 플레이를 비롯한 하드웨어 장치, 네트워크 성능 통계에 대한 정보를 포함한다. 이 하이브의 정보는 하드 드라이브에 저장되지 않는다. 플러그 앤 플레이 정보는 컴퓨터가 시작할 때 구성되며 메모리에 저장된다.

## 편집
### 수동 편집
레지스트리는 윈도우 디렉터리에 있는 regedit.exe 또는 regedt32.exe를 실행하여 마이크로소프트 윈도우에서 수동으로 편집할 수 있다. 그러나 부주의한 레지스트리 편집은 돌이킬 수 없는 위험을 일으킬 수 있다. 그러므로 레지스트리를 편집하기 앞서 먼저 백업을 하는 것을 권장한다. 수많은 최적화, 해킹 도구는 윈도우 운영 체제의 일부를 수정하는 데 이용하고 있으며, 레지스트리에 대한 지식이 많지 않다면 이러한 것들을 사용하지 않는 것이 좋다.

현재의 레지스트리 도구의 단순한 기능은 윈도우 3.x에 선보였으며 그 이름은 "등록 정보 편집기"(Registration Info Editor)였다. 이것은 단순히 응용 프로그램의 데이터베이스였으며 문서 안의 OLE 객체를 편집하는 데 쓰였다.

윈도우 9x 운영 체제는 윈도우와 MS-DOS 리얼 모드에서 사용할 수 있는 REGEDIT.EXE를 포함하고 있다. 윈도우 NT는 레지스트리 편집에 대한 허가를 도입하였다. 윈도우 NT 4.0과 윈도우 2000은 윈도우 9x REGEDIT.EXE 프로그램과 윈도우 NT 3.x의 REGEDT32.EXE 프로그램을 둘 다 가지고 있었다. 이러한 운영 체제에서 쓰이는 이 두 개의 편집 프로그램에는 어느 정도의 차이가 있다:
* REGEDIT.EXE는 "내 컴퓨터"로 시작하는 왼쪽에 트리 보기를 가지고 있으며 모든 하이브를 나열한다. REGEDT32.EXE는 왼쪽에 트리 보기가 있지만 각 하이브는 저마다 창을 갖고 있으므로 트리는 오직 키만을 보여 주었다.
* REGEDIT.EXE는 값의 세 가지 구성 요소(이름, 형, 데이터)를 각 표의 열로 보여 주었다. REGEDT32.EXE는 이러한 요소들을 문자열 목록으로 보여 주었다.
* REGEDIT.EXE는 트리 보기에서 마우스 오른쪽 클릭을 지원하여 속성과 다른 설정을 수정할 수 있었다. REGEDT32.EXE는 맨 위의 메뉴 표시줄을 통해서만 모든 동작을 수행할 수 있었다.
* REGEDIT.EXE는 키 이름, 값, 데이터를 모든 레지스트리를 통해 검색할 수 있는 반면, REGEDT32.EXE는 한 번에 한 하이브 안에서 키 이름을 검색할 수 있었다.
* REGEDIT.EXE가 직접 윈도우 95로부터 가져온 것이기 때문에 허가 권한 편집을 지원하지 않았다. (윈도우 9x에서는 허가라는 개념이 존재하지 않았다) 그러므로 NT 레지스트리의 완전한 기능에 접근하는 유일한 방법은 REGEDT32.EXE를 이용하는 것이었다.
* REGEDIT.EXE는 문자열 (REG_SZE)와 이진 (REG_BINARY), 그리고 DWORD (REG_DWORD) 값만을 지원하였다. REGEDT32.EXE는 확장 가능 문자열 (REG_EXPAND_SZ)와 다중 문자열 (REG_MULTI_SZE)도 지원한다.
윈도우 2000이나 윈도우 NT 4.0에서 지원하지 않는 키 종류를 편집하려고 하면 반환할 수 없는 형태로 변환한다.

윈도우 XP는 두 개의 프로그램들을 하나로 통합한 첫 운영 체제였으며, 이전의 REGEDIT.EXE 인터페이스를 가지고 REGEDT32.EXE의 기능을 추가하였다. 위에 나열된 차이점들은 윈도우 XP 이후의 운영 체제에 적용되지 않는다. REGEDIT.EXE는 개선된 편집기가 되었으며, REGEDT32.EXE는 단순히 REGEDIT.EXE를 불러오는 단순한 방식을 가진다.

이 레지스트리 편집기는 사용자가 다음의 기능을 수행할 수 있게 도와 준다:
* 레지스트리 키, 서브키, 값, 값 데이터를 만들고 제어하고 이름을 바꾸고 삭제한다.
* `REG` 파일들을 가져오고 내보낸다. 이진 하이브 포맷으로 자료를 내보낸다.
* 레지스트리 하이브 포맷 파일을 불러오고 제어하고 업로드할 수 있다. (윈도우 NT 기반의 운영 체제에서만)
* ACL 기반의 허가를 설정한다. (윈도우 NT 기반의 운영 체제에서만)
* 사용자가 지정한 레지스트리 값을 즐겨찾기로 등록한다.
* 키 이름, 값 이름, 값 데이터에서 특정한 문자열을 찾는다.
* 다른 네트워크 컴퓨터의 레지스트리를 원격으로 편집한다.

### .<code>REG</code> 파일
레지스트리 항목이라 불리는 .`REG` 파일은 문자열 기반의 사람이 이해할 수 있는 파일이며 레지스트리의 일부가 저장되어 있다.
윈도우 2000 이후의 NT 기반 운영 체제에서, 이러한 레지스트리 파일은 처음 시작 내용에 *Windows Registry Editor Version 5.00*를 포함하고 있으며 유니코드를 기반으로 하고 있다. 윈도우 9x와 NT 4.0 운영 체제에서는 "REGEDIT4"라는 문자열을 포함하며 ANSI를 기반으로 하고 있다. 윈도우 9x 포맷 .`REG` 파일은 윈도우 2000, 후반 NT 기반 운영 체제와 호환된다. 이 세 운영 체제의 윈도우 레지스트리 편집기는 윈도우 9x/NT 형태의 .`REG` 파일을 내보내는 기능을 제공한다. .`REG`에 저장되는 데이터는 다음의 구문을 사용하여 저장된다:

 [\\]
 "값 이름"=:

이를테면, "값 A", "값 B", "값 C", "값 D", "값 E"를 HKLM\SOFTWARE\Microsoft 키에 추가하려면 다음과 같이 지정하면 된다.

```reg
Windows Registry Editor Version 5.00
 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]
 "값 A"="<문자열 값 데이터>"
 "값 B"=hex:<이진 데이터>
 "값 C"=dword:<DWORD 값 정수>
 "값 D"=hex(7):<다중 문자열 값 데이터>
 "값 E"=hex(2):<확장 가능한 문자열 값 데이터>
```

.`REG` 파일의 데이터는 이러한 파일을 두 번 누르거나 명령 프롬프트에서 /s 스위치를 사용하여 레지스트리를 추가하거나 병합할 수 있다. .`REG` 파일은 레지스트리 데이터를 제거하는 데 사용할 수도 있다.

키 (모든 서브키, 값, 데이터)를 제거하려면 .`REG` 파일은 빼기 표시 ("-")를 하이브 이름 앞에 넣어 주어야 한다.

이를테면,  키(모든 서브키, 값, 데이터)를 제거하려면 다음과 같이 하면 된다.

```reg
[-HKEY_LOCAL_MACHINE\SOFTWARE\<키 이름>]
```

키와 그 데이터를 제거하려면, 해당 .`REG` 파일은 제거할 값의 등호 뒤에 빼기 표시 ("-")를 넣어 주어야 한다.

이를테면, "값 A"와 "값 B" 값들만  키에서 제거하려면 다음과 같이 하면 된다,

```reg
[HKEY_LOCAL_MACHINE\SOFTWARE\<키 이름>]
 "값 A"=-
 "값 B"=-
```


### 명령 줄 편집
레지스트리는 명령 줄에서 수많은 방법으로 제어할 수 있다. `reg.exe` 유틸리티 도구는 윈도우 XP와 윈도우 비스타에 포함되어 있으며, 이전 버전용 또한 별도로 내려 받아 사용할 수 있다. 윈도우의 설치 CD 원본에 있는 리소스 킷 CD에도 이 유틸리티가 포함되어 있다.

 reg.exe Operation [매개변수 목록]

 Operation [QUERY|ADD|DELETE|COPY|SAVE|LOAD|UNLOAD|RESTORE|COMPARE|EXPORT|IMPORT]

또한 `.REG` 파일은 다음의 명령어를 통해 가져올 수 있다:

 regedit.exe /s 파일 이름

/s는 레지스트리에 조용하게 병합한다는 것을 뜻한다. `/s` 변수가 빠지면, 레지스트리 병합 작업을 수행할 것인지 사용자에게 확인을 요청한다. 윈도우 95와 윈도우 98에서 `/s` 스위치는 `regedit.exe`가 관리자가 비활성화할 수 있게 만들어 주는 레지스트리 안의 설정 사항을 무시하게 만든다. `/s` 스위치를 사용하면 Regedit는 작업을 실패할 때 reg.exe가 하는 바와 달리 적절한 반환 코드를 반환하지 않는다. (기본적으로 실패 여부를 알려 주지 않는다는 뜻) 그러나 다음과 같은 줄을 배치 파일에 추가함으로써 실패 여부를 확인할 수 있다:


```dos
regedit /s file.reg
regedit /e test.reg "key"
if not exist test.reg goto REGERROR
del test.reg
```


윈도우 98을 시작으로, 마이크로소프트 윈도우의 수많은 버전에서 `.REG` 파일의 기본 연결은 사용자에게 병합 확인을 요구하지 않는다.

다른 명령 줄 옵션은 CScript, WMI (`WMIC.exe`), 윈도우 파워셸과 더불어 VBScript 또는 JScript를 함께 포함하고 있다.

레지스트리 허가는 `[http://www.microsoft.com/downloads/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&DisplayLang=en SubInACL.exe]` 도구를 이용하여 제어할 수 있다. HKEY_LOCAL_MACHINE\SOFTWARE 키의 허가는 다음과 같이 입력하여 표시할 수 있다:

 subinacl /keyreg HKEY_LOCAL_MACHINE\SOFTWARE /display

HKEY_LOCAL_MACHINE\SOFTWARE 키와 해당하는 모든 서브키의 소유자를 관리자로 설정하려면 다음과 같이 하면 된다:

 subinacl /keyreg HKEY_LOCAL_MACHINE\SOFTWARE /setowner=Administrator
 subinacl /subkeyreg HKEY_LOCAL_MACHINE\SOFTWARE /setowner=Administrator

HKEY_LOCAL_MACHINE\SOFTWARE 키를 완전하게 관리자 권한으로 제공하려면 다음과 같이 하면 된다:

 subinacl /keyreg HKEY_LOCAL_MACHINE\SOFTWARE /grant=Administrator=F

### 프로그램 또는 스크립트
레지스트리는 고급 윈도우 32 기반 API 라이브러리 (advapi32.dll)의 API를 통해 편집할 수 있다.

수많은 프로그래밍 언어는 자체 런타임 라이브러리 기능이나 클래스를 제공하여 프로그램들이 레지스트리의 설정을 저장할 수 있게 도와 준다. (이를테면 VB.NET, C#의 `Microsoft.Win32.Registry`  또는 델파이의 `TRegistry`). 비주얼 베이직 6와 같은 COM을 사용하는 응용 프로그램들은 WSH `WScript.Shell` 오브젝트를 사용할 수 있다. 다른 방법으로는 윈도우 리소스 킷 도구, Reg.exe를 사용하여 코드로부터 이 실행 파일을 실행하게 하는 것이다. (비록 이러한 작업이 좋지 않은 프로그래밍 스타일이긴 하지만 말이다.)

이와 비슷하게, 펄 (`[http://search.cpan.org/~adamk/Win32-TieRegistry-0.25/TieRegistry.pm Win32::TieRegistry]` 이용), 윈도우 파워셸, 윈도우 스크립트 호스트와 같은 스크립트 언어는 스크립트로부터 레지스트리를 편집할 수 있게 만들어 준다.

## 위치
레지스트리는 윈도우의 버전에 따라 여러 개의 파일에 저장된다. 이러한 파일들이 다르고 위치 또한 다를 수 있지만 모두 로컬 컴퓨터에 존재한다. 사용자에 특화된 HKEY_CURRENT_USER 사용자 레지스트리 하이브는 `Ntuser.dat`에 저장된다. 사용자가 로밍 파일을 가지고 있으면 이 파일은 로그아웃할 때 서버에 복사하고 로그인할 때 서버로부터 복사를 받는다.
### 윈도우 NT 기반의 운영 체제
윈도우 NT 기반의 운영 체제는 레지스트리를 이진 파일의 하이브 형식으로 저장한다. 윈도우 NT 기반 운영체제들이 내보내고 불러오는 등의 작업을 할 수 있도록 구성되어 있다. 다음의 레지스트리 파일들은 `%SystemRoot%\System32\Config\`에 저장된다:
* `Sam` – HKEY_LOCAL_MACHINE\SAM
* `Security` – HKEY_LOCAL_MACHINE\SECURITY
* `Software` – HKEY_LOCAL_MACHINE\SOFTWARE
* `System` – HKEY_LOCAL_MACHINE\SYSTEM
* `Default` – HKEY_USERS\.DEFAULT
* `Userdiff` – 하이브에 연결되어 있지 않다. 운영 체제를 업그레이드할 때에만 이용한다.

아래의 파일들은 개별 사용자 프로파일 폴더에 저장된다:
* `%UserProfile%\Ntuser.dat` – HKEY_USERS\ (HKEY_CURRENT_USER로 연결)
* `%UserProfile%\Local Settings\Application Data\Microsoft\Windows\Usrclass.dat` (경로는 운영 체제의 언어에 따라 지역화되어 있다) – HKEY_USERS\_Classes (HKEY_CURRENT_USER\Software\Classes)

윈도우 2000은 레지스트리 하이브 (.ALT)의 대체 복사본을 유지하고, 손상이 감지될 때 기존의 복사본으로 되돌린다.
윈도우 XP와 윈도우 서버 2003은 NTLDR이 System.log 파일을 처리하여 시스템 종료 또는 충돌 시 일정하지 않은 시스템 하이브의 날짜를 가져올 수 있으므로 System.alt 하이브를 유지하지 않는다. 또한 `%Windir%\Repair` 폴더는 윈도우를 설치하여 성공적으로 시작한 뒤에 만들어진 시스템 레지스트리 하이브의 복사본을 포함하고 있다.

### 윈도우 95, 98, Me
레지스트리 파일은 `USER.DAT`와 `SYSTEM.DAT`라는 이름을 가지며 `%WINDIR%` 디렉터리에 저장된다. 윈도우 Me에서는 `Classes.dat`가 추가되었다. 또한 각 사용자 프로파일은 프로파일을 사용할 경우 저마다 프로파일 디렉터리 안에 `USER.DAT`를 가지고 있다.

### 윈도우 3.11
윈도우 3.11을 개발하는 동안, .INI 파일을 제거해야 하는 필요성이 제기되었다. 이에 따라 새로운 파일 형식이 프로그래밍 환경에 도입되었으며 이 파일을 `Reg.dat`라 부른다. 이 파일은 `C:\WINDOWS` 디렉터리에 저장되며, 윈도우 95 레지스트리의 선구자 역할을 한다.

## 백업 및 복구
윈도우는 여러 개의 방식을 지원하여 레지스트리를 백업하고 복원한다:
* 윈도우 NT 기반의 운영 체제는 자동으로 각 하이브의 백업본 (.BAK)을 `%Windir%\System32\config` 폴더에 만든다. 어떠한 파일이든 복구 콘솔을 통해 복원할 수 있다.
* 시스템 복원은 윈도우가 시동할 수 있을 경우, 또는 윈도우 비스타 시작 시 윈도우 복구 환경으로부터 레지스트리를 백업하고 복원할 수 있다.
* NT백업은 레지스트리를 시스템 상태의 일부로 백업하고 복원할 수 있다.
* 윈도우 98, 윈도우 Me는 레지스트리 검사 도구를 사용하여 레지스트리를 검사하고 수정할 수 있다. 명령 프롬프트에서는 Scanreg.exe를, 그래픽 사용자 인터페이스에서는 Scanregw.exe 파일을 이용하면 된다. 5 개의 자동 정규 백업본을 기본으로 만들 수 있으며 손상이 일어나면 수동으로 복원을 할 수 있다. 레지스트리 검사 도구는 레지스트리를 기본적으로 `%Windir%\Sysbckup`에 백업하며, scanreg.exe는 MS-DOS에서도 실행할 수 있다.
* 윈도우 95 CD-ROM는 긴급 복구 유틸리티 (ERU.exe)와 구성 백업 도구 (Cfgback.exe)를 포함하고 있으며, 이러한 도구들이 레지스트리를 백업하고 복원할 수 있게 도와준다.

## 같이 보기
* 응용 프로그램 가상화
* 크립토락커
## 참조


## 외부 링크

*  윈도우 레지스트리 정보 및 참조 (MSDN 라이브러리)
*  보안 계정 관리자
*  윈도우 레지스트리가 좋은 아이디어인가?  (CodingHorror)
*  윈도우 레지스트리의 원칙과 청소법 (HowStuffWorks)

분류:윈도우 구성 요소
분류:설정 파일