User Account Control(UAC)란,
Windows 운영체제의 보안 요소이다.
UAC는 관리자 권한이 없는 사용자가, 사용자 계정 변경이나/로그오프나/RunAs를 사용하지 않고도 관리자 권한의 작업을 하는 것을 허용한다.
UAC Enabled 된 프로그램을 설치하거나 실행하기
일부 프로그램의 설치나 실행 시 administrator access token을 필요로 하기에, 운영체제는 사용자에게 동의를 구하는 창(Consent Prompt)을 띄운다. 사용자가 동의를 하면 어드민 계정으로 전환할 필요 없이 해당 프로그램을 설치/실행할 수 있도록 한다.
어드민 권한이 필요한 작업들
- 프린터나 특정 하드웨어 설치
- 특정 어플리케이션 설치
(어드민 권한을 필요로 하는 어플리케이션이나, "C:\Program Files" 등 어드민 권한이 필요한 영역에 어플리케이션을 설치하는 경우) - 어드민 권한을 필요로 하는 어플리케이션 실행
- 시스템 시간 변경
- legacy 어플리케이션 실행
인스톨러 만들 때 UAC 설정하기
인스톨러 자체의 실행 권한 설정
NSIS 스크립트로 인스톨러를 만드는 경우, RequestExecutionLevel 로 UAC 레벨을 설정해 줄 수 있다.
RequestExecutionLevel admin # 어드민 권한 필요 - 실행 시 UAC 동의 창이 뜸
RequestExecutionLevel user # 어드민 권한 필요 없음 - 실행 시 UAC 동의 창 뜨지 않음
인스톨(설치) 과정에서 필요한 실행 권한
인스톨러는 user 권한으로 만들었다 하더라도, 사용자가 어드민 권한이 필요한 위치에 프로그램을 설치하려고 하면(C:\Program Files 등) 어드민 권한이 필요하다. 그냥 실행하면 인스톨러는 실행 되나, 파일 복사 등 설치가 되지 않는다.
- 이떄는, user 권한의 인스톨러를 RunAs를 사용해 어드민 권한으로 실행 하거나
- 인스톨러 자체를 admin 권한이 필요하도록 만들고, 어드민 권한이 필요 없는 위치에 설치할 경우 RunAsInvoker를 통해 UAC 동의 창을 띄우지 않도록 할 수 있다.
관련 문제 : 레지스트리
프로그램에서 레지스트리에 값을 쓰거나 읽는 경우, HKLM 또는 HKCU를 이용한다. 이 때 어느 레지스트리를 사용하는가에 따라 필요한 사용자 권한이 달라진다.
- HKLM(HKEY_LOCAL_MACHINE) : 모든 유저에게 적용되는 레지스트리 => 어드민 권한 필요
- HKCU(HKEY_CURRENT_USER) : 현재 사용자에게만 적용되는 레지스트리 => 사용자 권한 필요
따라서, 인스톨러의 실행 권한에 따라 사용하는 레지스트리도 맞춰 주어야 정상 동작 할 수 있다.
비정상 동작 예:
- 프로그램은 유저 권한으로 만들어서 사용자 권한으로 실행 했는데, 레지스트리는 HKLM을 사용하면 레지스트리 값을 제대로 못 쓰거나/읽을 수 있다.
- 프로그램은 어드민 권한으로 만들어서 모든 사용자 용으로 설치했는데, 레지스트리는 HKCU를 사용하면, 설치한 사용자 외의 사용자 계정으로 로그인해서 프로그램 실행 시 레지스트리 값을 정상적으로 읽어오지 못할 수 있다.
UAC가 적용되는 윈도우 버전
Windows 10, Windows 7, Windows 8, Windows Vista, Windows XP