**사용자 계정 컨트롤**(User Account Control, **UAC**)은 마이크로소프트의 윈도우 비스타, 윈도우 서버 2008 운영 체제에서 처음 선보인 보안 기술로, 윈도우 7, 윈도우 서버 2008 R2, 윈도우 8, 윈도우 서버 2012, 윈도우 8.1, 윈도우 서버 2012 R2, 윈도우 10, 윈도우 11에도 존재한다. 관리자가 권한 수준을 높이는 것을 허용할 때까지 응용 프로그램들은 표준 사용자 권한으로 제한을 둠에 따라 운영 체제의 보안을 개선하는 데 중점을 두었다.

사용자 계정 컨트롤을 가지고 사용자는 관리자 권한을 얻을 수 있지만 사용자가 실행하는 응용 프로그램은 사용자가 더 높은 수준의 권한을 미리 승인하지 않는 한 그러한 권한을 얻을 수 없다. 사용자 계정 컨트롤은 사용자 인터페이스 권한 분리를 사용하여 관리자와 비관리자의 작업을 따로 떼어 놓는다. 한 예로 인터넷 익스플로러 7에서 선보인 "보호 모드"를 들 수 있다.

UAC는 사용자에게 추가적인 권한을 자동으로 확인할 수도 있지만, 사용자가 직접 프로그램 아이콘에서 마우스 오른쪽 단추를 누르고 "관리자 권한으로 실행"을 눌러도 효과는 같다.

역사
--

마이크로소프트의 가정용 운영 체제(윈도우 95, 윈도우 98, 윈도우 미와 같은)들은 같은 컴퓨터에 각기 다른 사용자 계정을 사용한다는 개념이 없었고 모든 동작은 슈퍼 사용자의 권한으로 수행되었다. 윈도우 NT는 여러 개의 사용자 계정을 도입하였으나 실제로 대부분의 사용자들은 그들의 일상적인 작업을 위해 슈퍼 사용자 관리자로 운영하기 시작했다. 그뿐 아니라 수많은 응용 프로그램들은 컴퓨터를 사용하는 사람이 슈퍼 사용자인 것으로 판단하며 슈퍼 사용자가 아닐 경우 단순히 동작하지 않는다.

차후에 나온 윈도우와 마이크로소프트 응용 프로그램들은 관리자 권한이 없는 사용자 로그인을 사용할 것을 장려해 왔으나 이에 대한 진전은 느리게 진행되고 있다. 이를 위해 사용자 계정 컨트롤이 비스타에 도입되었지만 기존의 응용 프로그램들을 무너뜨리지 않고 새로운 보안 기능들을 도입하는 데 어려움이 있다.

비스타를 표준 사용자로 로그인할 때 로그온 세션이 만들어지고 가장 기본적인 권한만 보유하고 있는 토큰만이 할당된다. 이런 식으로 새로운 로그온 세션은 전체 시스템에 영향을 미칠 수 있는 사항들을 변경하지 못한다. 관리자 그룹에 있는 사용자로 로그인할 때 두 개의 별도의 토큰이 할당된다. 첫 토큰은 관리자에게 일반적으로 제공되는 모든 권한을 담고 있고 두 번째 토큰은 표준 사용자가 받는 것과 비슷한 제한된 토큰이다. 윈도우 셸을 비롯한 사용자 응용 프로그램들은 제한된 토큰을 가지고 시작하므로 결과적으로 관리자 계정을 사용한다 해도 제한된 권한 환경을 사용하게 된다. 응용 프로그램이 더 높은 권한을 요청하거나 "관리자 권한으로 실행"을 클릭할 때 사용자 계정 컨트롤은 확인 절차를 묻고 사용자가 동의하면 제한되지 않는 토큰을 사용하여 프로세스를 시작하게 된다.

윈도우 7에서 마이크로소프트는 여러 방향으로 UAC를 업데이트하고 있다. 기본적으로 UAC는 프로그램이 상승된 허가 권한을 요구하는 변경을 시도할 때에만 확인 절차를 밟는다. 윈도우 설정을 변경한다고 해서 사용자 계정 컨트롤 확인 창을 띄우는 것은 아니다. 이렇게 사용자는 UAC의 빈도 설정을 제어판에서 쉽게 바꿀 수 있게 하고 있다.

UAC를 물어 보게 하는 작업
----------------

UAC가 켜져 있는 동안 UAC를 물어 보게 하는 작업은 다음과 같다:

* 응용 프로그램의 아이콘에서 마우스 오른쪽 단추를 누른 뒤 "관리자 권한으로 실행"을 누른다.
* %SystemRoot%의 파일을 %ProgramFiles%로 옮긴다.
* 응용 프로그램을 설치하거나 지운다.
* 장치 드라이버를 설치한다.
* 액티브엑스 컨트롤을 설치한다.
* 윈도우 방화벽의 설정을 바꾼다.
* UAC 설정을 바꾼다.
* 윈도우 업데이트를 구성한다.
* 사용자 계정을 추가하거나 지운다.
* 사용자 계정의 종류를 바꾼다.
* 부모 제어를 구성한다.
* 작업 스케줄러를 실행한다.
* 백업해 두었던 시스템 파일들을 복원한다.
* 다른 사용자의 폴더와 파일을 보거나 변경한다.
* 권한 상승을 유도하는 메니페스트가 포함된 프로그램을 실행한다. (설치 프로그램 파일이 보통 이러한 기능을 이용한다.)
* setup, install과 같은 문자열이 이름에 포함된 실행 파일을 실행한다.

시간대를 바꾸는 등의 일반 작업은 관리자 권한을 요구하지 않는다. 게다가, 초기 버전의 윈도우에서 관리자 권한을 요구했던 수많은 작업들(이를테면 중요한 윈도우 업데이트를 설치하는 것)은 더 이상 비스타에 존재하지 않는다.

기능
--

사용자 계정 컨트롤은 사용자 인터페이스 표시 향상을 위해 완전한 화면이 일시적으로 어두워지며 인증 창만이 강조되는 보안 데스크톱 모드에서 기밀 사항을 확인한다. 다른 프로그램이 응용 프로그램 요청 강조에 의한 사용자 인터페이스나 마우스를 속이거나 하는 것을 막기 위해서이다. 관리 활동이 최소화된 응용 프로그램으로부터 비롯되는 경우, 보안 데스크톱 요청은 또한 최소화된다. 보안 데스크톱을 사용하지 않게 할 수도 있지만, 보안 측면에서 바람직한 방법은 아니다.

수많은 UAC 설정을 건드릴 수 있으며 다음과 같은 방법도 사용할 수 있다:

* 관리자가 암호를 다시 입력하게 함으로써 기존의 보안을 더 강화한다.
* 인증 과정의 일부로서 Ctrl-Alt-Del을 누르게 함으로써 기존의 보안을 더 강화한다.
* 관리자 승인 모드(UAC가 관리자 확인을 묻는 것)를 완전하게 사용하지 않는다.

관리자 상승 상태에서 실행되는 명령 프롬프트 창은 창 제목 맨 끝에 "관리자"라는 낱말의 접두사가 붙는다. 그럼으로써 명령 프롬프트가 관리자 권한으로 실행되고 있음을 사용자가 알 수 있게 도와 준다. 인터넷 익스플로러 7의 "보호 모드" 기능은 UAC가 낮은 권한 수준으로 실행된다. (표준 사용자의 경우 "중간" 정도의 권한 수준을 가지며, 관리자 권한을 가지는 경우 높은 권한 수준을 가진다) 그러므로 UAC를 통해 관리자 권한을 상승하지 않고서는 시스템 대부분(임시 인터넷 파일 폴더는 제외하고)에 파일이나 디렉터리, 특성의 기록이 불가능하다. 도구 모음과 액티브엑스 컨트롤이 인터넷 익스플로러 프로세스 안에서 실행되기 때문에, 그러한 것들도 모두 낮은 권한에서 실행되며 시스템에 해를 미치는 경우도 적어지게 된다.

구성
--

UAC는 보안 설정 (secpol.msc)을 통해 구성할 수 있다. 모든 구성 항목은 "사용자 계정 컨트롤"이라는 접두사가 붙게 된다. 아래의 설정을 통해 UAC를 제어할 수 있게 도와 준다.

* 관리자 상승 모드에서 권한 상승을 묻게 하는 동작
	+ UAC를 끈다 (묻지 않음)
	+ 동의를 확인한다 (기본값)
	+ 자격 증명을 확인한다.
* 표준 사용자에 대한 권한 상승을 묻게 하는 동작
	+ 확인하지 않는다
	+ 자격 증명을 묻는다
* 내장된 관리 계정을 위한 관리자 상승 모드
	+ 사용 (기본값)
	+ 사용 안 함
* 응용 프로그램이 설치될 것을 감지하여 권한 상승을 확인한다.
	+ 사용 (기본값)
	+ 사용 안 함
* 권한 상승을 확인할 때 보안 데스크톱으로 전환한다.
	+ 사용 (기본값)
	+ 사용 안 함
* 서명이 확인된 실행 파일만 실행한다.
	+ 사용
	+ 사용 안 함 (기본값)
* 사용자마다 파일과 레지스트리 쓰기 실패를 가상화한다.
	+ 사용 (기본값)
	+ 사용 안 함
* 모든 관리자들을 관리자 상승 모드에서 실행한다.
	+ 사용 (기본값)
	+ 사용 안 함

권한 상승 요청
--------

프로그램은 여러 방식 안에서 권한 상승을 요청할 수 있다. 프로그램 개발자들이 쓰는 방법들 가운데 하나는 requestedPrivileges 섹션을 manifest라는 XML 문서 안에 추가하는 것이다. 그럼으로써 응용 프로그램에 이 문서 내용이 추가된다. manifest는 시각 스타일, 독립성, 그리고 적절한 보안 구문을 지정할 수 있다. 이를 쉽게 도와주는 유틸리티가 있으며, 자세한 것은 "외부 링크"를 참고한다.

권한 상승을 요청하는 보안 구문은 다음과 같다:

```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
 <v3:security>
 <v3:requestedPrivileges>
 <v3:requestedExecutionLevel level="highestAvailable" />
 </v3:requestedPrivileges>
 </v3:security>
 </v3:trustInfo>
</assembly>

```

requestedExecutionLevel에 대한 수준 특성을 "asInvoker"로 설정하면 응용 프로그램을 시작하는 토큰(token)을 가지고 실행되게 만들며, "highestAvailable"는 UAC가 권한이 낮은 일반 사용자에게 관리자 권한 상승을 묻게 해 주며, "requireAdministrator"는 권한 상승을 요구하게 만든다. highestAvailiable, requireAdministrator 모드 두 곳에서, 확인 제공을 실패할 경우 프로그램이 실행되지 않게 된다. manifest 안의 "requireAdministrator"로 표시된 실행 파일은 CreateProcess()를 사용하여 비상승 프로세스에서 실행될 수 없다. 그 대신, ERROR\_ELEVATION\_REQUIRED라는 값으로 반환된다. ShellExecute() 또는 ShellExecuteEx()를 대신 사용하여야 한다. HWND가 제공되지 않는 경우, 대화 상자는 작업 표시줄 안에 깜박이는 항목으로 표시된다.

권한이 상승된 새로운 프로세스는 "runas"를 사용하는 닷넷 응용 프로그램 안에서 실행될 수 있다. C++/CLI를 사용한 예는 다음과 같다:

```
System::Diagnostics::Process^ proc = gcnew System::Diagnostics::Process();
proc->StartInfo->FileName = "C:\\Windows\\system32\\notepad.exe";
proc->StartInfo->Verb = "runas"; // Elevate the application
proc->Start();

```

네이티브 윈32 응용 프로그램의 경우, 같은 "runas"가 ShellExecute()나 ShellExecuteEx() 콜에 추가될 수 있다.

```
ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW\_SHOWNORMAL);

```