EMDI는 지금도 개발중

C# : 레지스트리(Registry) 읽기, 쓰기, 삭제 사용방법 using Registry 본문

언어/C#

C# : 레지스트리(Registry) 읽기, 쓰기, 삭제 사용방법 using Registry

EMDI 2020. 3. 12. 13:27

이번 글에서는 C#에서 레지스트리 클래스를 이용하여 레지스트리 읽기, 쓰기, 관리를 다루는 방법에 대해 알아보도록 합시다.

  • 레지스트리란, 마이크로스프트 윈도우 32/64비트 버전과 윈도우 모바일 운영체제의 설정과 선택 항목을 담고 있는 데이터베이스.

 

1. 레지스트리 편집기 이해하기

 

레지스트리 편집기는 [시작]→[실행] 에서 regedit을 검색하면 들어갈 수 있다. 레지스트리 편집기에 들어가면 5개의 서브트리로 이루어져 있는 것을 알 수 있는데

 

트리명 내용
HKEY_CLASSES_ROOT 윈도우에서 사용하는 각 프로그램과 파일 확장명 연결에 대한 정보 저장
윈도우의 OLE와 관련된 내용 저장
각 파일과 프로그램간의 연결에 대한 정보가 들어가 있는 부분이다.
HKEY_CURRENT_USER 현재 로그인된 사용자에 대한 설정 정보를 저장
로그인된 유저의 개인 환경 설정 및 사용자가 설치한 응용프로그램을 비롯하여 응용프로그램의 우선순위, 화면색상, 보안 접근 허용 여부 등에 대한 정보를 담고 있다.
하위 디렉터리로는 제어판설정, 키보드 레이아웃, 현재 사용자의 소프트웨어 설정 상태 등에 대한 정보
- AppEvent : 소리, 이벤트 등 효과음 관련 설정정보
- Console : 제어판에 저장된 설정정보 및 바탕화면 설정내용 저장
- Control Panel : 화면보호기, 테마, 키보드 마우스 설정 정보
- Environment : 윈도우 7이전 세대의 시스템등록정보의 환경변수 저장
- EUDC : 윈도우 7이전세대의 eudc정보 저장
- Identities : 아웃룩, 메신저 등 윈도우 메일프로그램 정보 저장
- Keyboard Layout : 키보드의 정보저장 및 사용자의 사용인 형식 저장
- Network : 네트워크 정보 저장
- Printers : 프린터 연결상황 및 이름, 인쇄용지, 기본설정 정보 저장
- Sessions Information : 윈도우XP에서 사용되는 키로 PC의 작업내용 저장
- Software : Pc에서 사용중이며 설치된 모든 프로그램 변수, 정보저장(64qlxmdlsruddn)
- UNICODE Program Groups : 윈도우 7이전의 xp.2000에서 사용되며 유니코드를 사용한 그룹정보 저장
- Volatile Environments : xp.2000에서 사용되며 로그온사용자 정보 저장
HKEY_LOCAL_MACHINE 사용 중인 드라이버 정보, 프린터, USB등과 같이 컴퓨터에 설치된 하드웨어 정보를 비롯하여 소프트웨어에 대한 모든 정보가 담겨져 있다. 간단한 레지스트리 편집은 대부분 이곳의 정보를 편집하게 된다.
-HARDWARE : 수치연산 프로세서, 직렬 포트, 모뎀 등 하드웨어 관련 설정을 저장
- SOFTWARE : 응용 프로그램에서 컴퓨터 단위로 적용하는 설정 데이터를 저장
- SYSTEM : 윈도우 시스템의 부팅과 관련된 설정 데이터를 저장
HKEY_USERS 다중 사용자를 지원하는 시스템에서 사용자에 대한 키 항목이 생성되어 해당 환경에 대한 정보가 저장된다. 즉, 이전에 로그인했던 사용자들을 위해 초기화 파일을 보관해 놓는 것이다. 단일 사용자일 경우에는 HKEY_CURRENT_USER동일
HKEY_CURRENT_CONFIG 현재 사용중인 윈도우의 디스플레이 정보와 폰트정보, 프린트 정보 등의 설정 정보가 담겨져 있다.

 

2. C#에서 사용해보기

우선 레지스트리 클래스를 이용하려면 using Microsoft.Win32 네임스페이스를 지정해줘야 합니다.

* 아래의 표는 [끝나지 않는 프로그래밍 일기] 라는 블로그를 통해 재정리한 표입니다.

 

멤버 메서드 설명 사용방법
CreateSubKey 새 하위 키를 만들거나 기존 하위 키를 엽니다. RegistryKey rkey = Registry.CurrentUser.CreateSubKey("c# rkey").CreateSubKey("testsubkey");
OpenSubKey 지정된 하위 키를 검색합니다. RegistryKey rkey = Registry.CurrentUser.OpenSubKey("c# rkey").OpenSubKey("testsubkey");
DeleteSubKey 지정된 하위 키를 삭제합니다. Registry.CurrentUser.DeleteSubKey(@"c# rkey\qwd");
DeleteSubKeyTree 하위 키와 자식 하위 키를 재귀적으로 삭제합니다.
GetSubKeyNames 모든 하위 키 이름이 포함된 문자열의 배열을 검색합니다.
SetValue 레지스트리 키에서 이름/값 쌍의 값을 설정합니다. rkey.SetValue("test", "테스트!");
GetValue 지정된 이름과 연결된 값을 검색합니다. rkey.GetValue("test").ToString();
GetValueKind 지정된 이름과 연결된 값의 레지스트리 데이터 형식을 검색합니다.
GetValueNames 이 키와 관련된 모든 값 이름이 포함된 문자열의 배열을 검색합니다.
DeleteValue 지정된 값을 이 키에서 삭제합니다. rkey.DeleteValue("test");

 

3. C# 오류체크하기

제가 레지스트리를 가지고 테스트 해보고 싶었던 부분은 바로 [제어판]-[시스템 및 보안]-[전원 옵션]에서 전원단추 정의 및 암호 보호 설정 화면으로 들어가서 빠른 실행하기를 컨트롤 하기. 근데 C#에 배운대로 하다 보니 오류가 발견하더군요..

 

 
// Create HKEY_LOCAL_MACHINE registry Key
RegistryKey parentkey = Registry.LocalMachine;

// Open the System
RegistryKey powerKey = parentkey.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Power", true);
MessageBox.Show(powerKey.GetValue("HiberbootEnabled").ToString());
powerKey.SetValue("HiberbootEnabled", 0 , RegistryValueKind.DWord);

위의 내용과 같이 소스를 작성한다음 실행을 해보니 오류가 빡! 일어난 오류는 System.Security.SecurityException '요청한 레지스트리에 엑세스할 수 없습니다'

 

이게 어찌된 영문이지라고 생각하면서 구글링을 해보니 알고보니 관리자 권한이 없어서 그런거라고 하네요. 그럼 해당 프로젝트에 관리자 권한을 부여하도록 합시다!

관리자 권한 부여는 해당 프로젝트의 속성 또는 Properties를 더블 클릭하면 첫번째 사진과 같이 다양한 속성창들이 보이는데

  1. 그것들 중에서 [보안]에 들어가서 Clickonce를 체크하고 완전 신뢰 응용프로그램으로 설정합니다.
  2. 그럼 app.manifest 라는 파일이 생성되는데 그 파일 안의 내용 중
  3. <requestExcutionLevel level="aslnvoker" ~>라고 지정된 level 부분을 requireAdministrator로 변경하고 저장.

그러고 난 다음 실행해보니 정상적으로 값이 변경되는걸 확인할 수 있었네요~

Comments