윈도우 레지스트리

윈도우 레지스트리(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에 대신 저장한다.
하이브의 종류는 다음과 같다.
편집.
수동 편집.
레지스트리는 윈도우 디렉터리에 있는 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 프로그램을 둘 다 가지고 있었다. 이러한 운영 체제에서 쓰이는 이 두 개의 편집 프로그램에는 어느 정도의 차이가 있다:
윈도우 2000이나 윈도우 NT 4.0에서 지원하지 않는 키 종류를 편집하려고 하면 반환할 수 없는 형태로 변환한다.
윈도우 XP는 두 개의 프로그램들을 하나로 통합한 첫 운영 체제였으며, 이전의 REGEDIT.EXE 인터페이스를 가지고 REGEDT32.EXE의 기능을 추가하였다. 위에 나열된 차이점들은 윈도우 XP 이후의 운영 체제에 적용되지 않는다. REGEDIT.EXE는 개선된 편집기가 되었으며, REGEDT32.EXE는 단순히 REGEDIT.EXE를 불러오는 단순한 방식을 가진다.
이 레지스트리 편집기는 사용자가 다음의 기능을 수행할 수 있게 도와 준다:
.codice_1 파일.
레지스트리 항목이라 불리는 .codice_1 파일은 문자열 기반의 사람이 이해할 수 있는 파일이며 레지스트리의 일부가 저장되어 있다.
윈도우 2000 이후의 NT 기반 운영 체제에서, 이러한 레지스트리 파일은 처음 시작 내용에 "Windows Registry Editor Version 5.00"를 포함하고 있으며 유니코드를 기반으로 하고 있다. 윈도우 9x와 NT 4.0 운영 체제에서는 "REGEDIT4"라는 문자열을 포함하며 ANSI를 기반으로 하고 있다. 윈도우 9x 포맷 .codice_1 파일은 윈도우 2000, 후반 NT 기반 운영 체제와 호환된다. 이 세 운영 체제의 윈도우 레지스트리 편집기는 윈도우 9x/NT 형태의 .codice_1 파일을 내보내는 기능을 제공한다. .codice_1에 저장되는 데이터는 다음의 구문을 사용하여 저장된다:
 [&lt;하이브 이름&gt;\&lt;키 이름&gt;\&lt;서브키 이름&gt;]
 "값 이름"=&lt;값 형태&gt;:&lt;값 데이터&gt;
이를테면, "값 A", "값 B", "값 C", "값 D", "값 E"를 HKLM\SOFTWARE\Microsoft 키에 추가하려면 다음과 같이 지정하면 된다.
 Windows Registry Editor Version 5.00
 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]
 "값 A"="&lt;문자열 값 데이터&gt;"
 "값 B"=hex:&lt;이진 데이터&gt;
 "값 C"=dword:&lt;DWORD 값 정수&gt;
 "값 D"=hex(7):&lt;다중 문자열 값 데이터&gt;
 "값 E"=hex(2):&lt;확장 가능한 문자열 값 데이터&gt;
.codice_1 파일의 데이터는 이러한 파일을 두 번 누르거나 명령 프롬프트에서 /s 스위치를 사용하여 레지스트리를 추가하거나 병합할 수 있다. .codice_1 파일은 레지스트리 데이터를 제거하는 데 사용할 수도 있다.
키 (모든 서브키, 값, 데이터)를 제거하려면 .codice_1 파일은 빼기 표시 ("-")를 하이브 이름 앞에 넣어 주어야 한다.
이를테면, &lt;키 이름&gt; 키(모든 서브키, 값, 데이터)를 제거하려면 다음과 같이 하면 된다.
 [-HKEY_LOCAL_MACHINE\SOFTWARE\&lt;키 이름&gt;]
키와 그 데이터를 제거하려면, 해당 .codice_1 파일은 제거할 값의 등호 뒤에 빼기 표시 ("-")를 넣어 주어야 한다.
이를테면, "값 A"와 "값 B" 값들만 &lt;키 이름&gt; 키에서 제거하려면 다음과 같이 하면 된다,
 [HKEY_LOCAL_MACHINE\SOFTWARE\&lt;키 이름&gt;]
 "값 A"=-
 "값 B"=-
명령 줄 편집.
레지스트리는 명령 줄에서 수많은 방법으로 제어할 수 있다. codice_11 유틸리티 도구는 윈도우 XP와 윈도우 비스타에 포함되어 있으며, 이전 버전용 또한 별도로 내려 받아 사용할 수 있다. 윈도우의 설치 CD 원본에 있는 리소스 킷 CD에도 이 유틸리티가 포함되어 있다.
 reg.exe Operation [매개변수 목록]
 Operation [QUERY|ADD|DELETE|COPY|SAVE|LOAD|UNLOAD|RESTORE|COMPARE|EXPORT|IMPORT]
또한 codice_12 파일은 다음의 명령어를 통해 가져올 수 있다:
 regedit.exe /s 파일 이름
/s는 레지스트리에 조용하게 병합한다는 것을 뜻한다. codice_13 변수가 빠지면, 레지스트리 병합 작업을 수행할 것인지 사용자에게 확인을 요청한다. 윈도우 95와 윈도우 98에서 codice_13 스위치는 codice_15가 관리자가 비활성화할 수 있게 만들어 주는 레지스트리 안의 설정 사항을 무시하게 만든다. codice_13 스위치를 사용하면 Regedit는 작업을 실패할 때 reg.exe가 하는 바와 달리 적절한 반환 코드를 반환하지 않는다. (기본적으로 실패 여부를 알려 주지 않는다는 뜻) 그러나 다음과 같은 줄을 배치 파일에 추가함으로써 실패 여부를 확인할 수 있다:
regedit /s file.reg
regedit /e test.reg "key"
if not exist test.reg goto REGERROR
del test.reg
윈도우 98을 시작으로, 마이크로소프트 윈도우의 수많은 버전에서 codice_12 파일의 기본 연결은 사용자에게 병합 확인을 요구하지 않는다.
다른 명령 줄 옵션은 CScript, WMI (codice_18), 윈도우 파워셸과 더불어 VBScript 또는 JScript를 함께 포함하고 있다.
레지스트리 허가는 codice_19 도구를 이용하여 제어할 수 있다. 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#의 codice_20 또는 델파이의 codice_21). 비주얼 베이직 6와 같은 COM을 사용하는 응용 프로그램들은 WSH codice_22 오브젝트를 사용할 수 있다. 다른 방법으로는 윈도우 리소스 킷 도구, Reg.exe를 사용하여 코드로부터 이 실행 파일을 실행하게 하는 것이다. (비록 이러한 작업이 좋지 않은 프로그래밍 스타일이긴 하지만 말이다.)
이와 비슷하게, 펄 (codice_23 이용), 윈도우 파워셸, 윈도우 스크립트 호스트와 같은 스크립트 언어는 스크립트로부터 레지스트리를 편집할 수 있게 만들어 준다.
위치.
레지스트리는 윈도우의 버전에 따라 여러 개의 파일에 저장된다. 이러한 파일들이 다르고 위치 또한 다를 수 있지만 모두 로컬 컴퓨터에 존재한다.
사용자에 특화된 HKEY_CURRENT_USER 사용자 레지스트리 하이브는 codice_24에 저장된다. 사용자가 로밍 파일을 가지고 있으면 이 파일은 로그아웃할 때 서버에 복사하고 로그인할 때 서버로부터 복사를 받는다.
윈도우 NT 기반의 운영 체제.
윈도우 NT 기반의 운영 체제는 레지스트리를 이진 파일의 하이브 형식으로 저장한다. 윈도우 NT 기반 운영체제들이 내보내고 불러오는 등의 작업을 할 수 있도록 구성되어 있다. 다음의 레지스트리 파일들은 codice_25에 저장된다:
아래의 파일들은 개별 사용자 프로파일 폴더에 저장된다:
윈도우 2000은 레지스트리 하이브 (.ALT)의 대체 복사본을 유지하고, 손상이 감지될 때 기존의 복사본으로 되돌린다.
윈도우 XP와 윈도우 서버 2003은 NTLDR이 System.log 파일을 처리하여 시스템 종료 또는 충돌 시 일정하지 않은 시스템 하이브의 날짜를 가져올 수 있으므로 System.alt 하이브를 유지하지 않는다. 또한 codice_34 폴더는 윈도우를 설치하여 성공적으로 시작한 뒤에 만들어진 시스템 레지스트리 하이브의 복사본을 포함하고 있다.
윈도우 95, 98, Me.
레지스트리 파일은 codice_35와 codice_36라는 이름을 가지며 codice_37 디렉터리에 저장된다. 윈도우 Me에서는 codice_38가 추가되었다. 또한 각 사용자 프로파일은 프로파일을 사용할 경우 저마다 프로파일 디렉터리 안에 codice_35를 가지고 있다.
윈도우 3.11.
윈도우 3.11을 개발하는 동안, .INI 파일을 제거해야 하는 필요성이 제기되었다. 이에 따라 새로운 파일 형식이 프로그래밍 환경에 도입되었으며 이 파일을 codice_40라 부른다. 이 파일은 codice_41 디렉터리에 저장되며, 윈도우 95 레지스트리의 선구자 역할을 한다.
백업 및 복구.
윈도우는 여러 개의 방식을 지원하여 레지스트리를 백업하고 복원한다: