Microsoft MVP성태의 닷넷 이야기
Windows: 16. 개발자를 위한 UAC 환경 설정 [링크 복사], [링크+제목 복사],
조회: 25867
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

개발자를 위한 UAC 환경 설정


이미 2차례에 걸쳐서, 다음과 같은 글로 UAC 관련 설명을 했습니다.

보호 모드와 필수 무결성 제어(MIC: Mandatory Integrity Control)
; https://www.sysnet.pe.kr/2/0/433

MIC 환경 구성 - Windows XP와 유사한 보안 설정
; https://www.sysnet.pe.kr/2/0/434

처음, 윈도우즈 비스타를 사용했을 때는, 개발자 환경이 워낙 관리 권한을 많이 건드리기 때문에 당연히 UAC를 해제해야만 한다고 생각했었습니다. 하지만, 조금씩 비스타에 익숙해지면서... UAC 창이 그다지 많이 뜨는 것은 아님을 알게 되었습니다. 여러분들도 한번 잠시 UAC 확인창에 대해서 생각해 보십시오. 정말로 그렇게 자주 뜨던가요?

솔직히, 응용 프로그램보다는 오히려 인터넷 웹 사이트에서 더욱 UAC 확인창을 요구하더군요. 아니 좀 더 정확히 말하면 UAC 확인창을 요구한다기보다는 애당초 관리자 권한으로 인터넷 익스플로러를 실행시켜야 하지요. ^^;

그건 그렇다 치고... 어쨌든 기존 환경에 비하면 단 한 번일지라도 UAC 확인창을 거쳐야 하는 것이 불편하지 않을리 없습니다. 따라서, 어떻게 해서든지 ^^ 조금이라도 편해질 수 있는 환경 설정을 하는 것이 좋을 텐데요.

나름대로 생각해 보면, 자신의 환경에 따라서 다음과 같은 4가지 구성 중에서 선택하는 것이 가능할 것 같습니다.



1. 기본 환경이 관리 모드여야 하는 개발자라면?
간단하지요. ^^; UAC를 해제하면 됩니다. "msconfig.exe"를 실행시키고, "Tools" 탭에 있는 "Disable UAC"를 실행시켜 준 후 재부팅을 하게 되면 UAC가 해제되고 기본적으로 모든 프로세스들의 "integrity SID" 값이 "high"로 설정되어 실행됩니다. 무조건 high 모드에서 개발하는 업종(예를 들면, 커널 개발 같은)이 아니라면 별로 권하고 싶지 않은 설정입니다.

2. 비록 빈번한 관리자 환경이 요구되기는 하지만 전체적인 MIC 환경은 유지하고 싶은 경우라면?
초기에 제가 즐겨 사용했던 구성입니다. 재부팅이 필요하지 않은데다 UAC 확인창이 뜨지 않고도 자동으로 관리 권한 요청이 발생하면 승격이 됩니다. (따라서, 인터넷 익스플로러 같은 경우에 명시적으로 "Run as administrator"로 실행시켜 주지 않으면 포탈 사이트의 ActiveX들이 정상적으로 동작하지 않았습니다.)

이러한 구성은 "로컬 보안 정책(local security policy)"에서 해줄 수 있습니다. "시작 메뉴"의 명령어 입력창(사실, 이제는 "검색"과 관련되어 있지만.)에서 "로컬 보안 정책"이라고 입력해 주시면 됩니다. 그럼, 다음과 같은 로컬 보안 정책 관리자 콘솔이 뜨게 되는데, "보안 설정" / "로컬 정책" / "보안 옵션"으로 이동해서 "사용자 계정 컨트롤: 관리자 계정일 때 관리 승인 모드에서 권한 상승 확인 방법" 값을 "권한 상승 전에 확인 안 함"으로 설정하는 것입니다.

uac_settings_for_dev_1.png

위와 같이 설정하게 된 이후에는, UAC 확인창이 뜨질 않습니다. 왜냐하면 자동으로 "확인"한 것으로 간주하기 때문입니다. 물론 승격 요청 이전에는 각 프로세스들의 "integrity SID" 값도 그대로 유지된 체 시스템이 운영됩니다. 재부팅도 필요하지 않기 때문에 무척 편리한 설정입니다. 사실, "권한 승격 요청"은 악성 코드에 상관없이 모두 할 수 있기 때문에 이 모드가 "안전"하다고 볼 수는 없습니다.

3. 특정 프로그램만이 관리 권한이 요구되는 환경이라면?
예를 들어, VS.NET 2005로 웹 사이트를 IIS와 연동하여 개발하는 경우라면, IIS의 메타베이스 정보를 접근하게 되어 관리자 권한이 필요하게 됩니다. 따라서, 이런 분들은 거의 매일 VS.NET 2005를 관리자 권한으로 실행하게 될 텐데요. 그때마다 매번 "관리자 권한으로 실행(Run as administrator)"으로 실행시키기가 꽤나 번거로울 테니, VS.NET 2005 아이콘을 오른쪽 마우스 버튼으로 눌러서 나오는 속성창에서 "관리자 권한으로 이 프로그램 실행(Run this program as an administrator)"을 설정해 두시는 것이 편리하겠습니다.

uac_settings_for_dev_2.png

즉,,, 이제부터는 UAC는 받아들이되 어떻게해서든지 번거로운 과정을 하나라도 줄이는 노력을 해야 하겠지요. ^^

4. 일반 응용 프로그램 개발자라면?
문제는 ^^ 이런 분들입니다. 방법이 없단 얘기입니다. 그냥 일반 사용자와 동등하게 UAC를 받아들이셔야 합니다. 위의 '3번'에서 살펴본 "관리자 권한으로 실행(Run as administrator)"조차도 이 분들은 대상이 될 수 없습니다. 왜냐고요?

일단, VS.NET 2005 프로세스가 관리 권한으로 승격된 이후에는, 그 자식으로 실행되는 프로세스들 역시 "high" 권한으로 실행되어 집니다. 아래의 화면은 VS.NET 2005에서 "WindowsApplication1" 프로젝트를 만든 후, "Ctrl + F5" 키를 눌러 실행시켰을 때의 프로세스 구조입니다. "WindowsApplication1.vshost.exe"는 물론이고 "WindowsApplication1.exe" 역시 "devenv.exe"의 자식 프로세스로 실행되기 때문에 "high" 권한을 그대로 물려받아 실행되게 됩니다. UAC 환경 테스트가 제대로 될 수 없겠지요!

uac_settings_for_dev_3.png



그럼, 저는 어떻게 해두고 쓰냐는 질문을 하실 분이 계실 텐데요. 저는 위의 "4번" 선택의 변형으로 해두고 있습니다. 기본적으로는 4번 단계인데, 거기에 "로컬 보안 정책"에서 "보안 설정" / "로컬 정책" / "보안 옵션"의 "사용자 계정 컨트롤: 권한 상승시 보안 데스크톱으로 전환" 값을 아래와 같이 "사용 안함"으로 두고 있습니다.

uac_settings_for_dev_4.png

데스크톱 보안을 사용하지 않게 되므로, UAC 확인창을 제어하려고 들면 보안이 뚫리게 되는 단점이 있지만 저처럼 ^^ 컴퓨터를 표준으로 사용하는 사람이라면 별다른 위험이 없을 것으로 "스스로" 판단하고 있기 때문에 이 정도로만 해두고 있습니다. 적어도 UAC 제어를 받는 프로그램의 개발에도 영향을 주지 않고 데스크톱 전환으로 인한 부하가 없기 때문에 개인적으로는 이 정도 선택이 가장 최선인 것 같습니다.

혹시... 여러분들 중에서 "나는 위에서 설명한 방법과는 다르게 구성했다."라는 분들이 계시다면 공개 좀 부탁드리겠습니다. ^^

마지막으로 하고 싶은 말.

"개발자일수록 UAC를 Enable 상태로 둬야 한다"





[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 2/11/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2007-01-15 03시01분
[WaterStone] 저는 완전히 UAC 기본 값으로 사용하고 있습니다.
문제가 무엇인가 알아야 대처가 가능하기 땀시...
가끔 WCF 프로그래밍이나 기타 관리자 권한이 필요한 경우에는 VS 2005를 관리자 권한으로 구동시키곤
합니다만...

참... 보안 데스크톱을 사용하지 않을 때의 장점이 있나요?
보안 상승 확인이 좀 더 빨리 뜬다든가 등등...
[guest]
2007-01-15 03시18분
예. 보안 상승 확인창이 빨리 뜹니다. 그나마 ^^; 0.1초의 생산성을 올리기 위해 택할 수 있었던 유일한 방법이었습니다.

보안 데스크톱 전환에 대해 설명한 글을 읽어보면 재미있는 사실을 발견할 수 있는데요. ^^ 원래 데스크톱 단위 사이에서는 화면 공유가 안되잖아요? 그런데, UAC 확인창이 뜰 때 배경에 기존 화면이 남아있을 수 있게 전체 화면을 캡쳐해서 이미지 처리한다고 합니다. 사실 많이 빨라서 덜 느낀다고는 해도,,, 어쨌든, 화면이 깜박이는 것 자체가 별로니까요.

조금은 편리할 수 있다고 해도, 다음의 글에서도 밝히듯이 그다지 권장하지 않는다고 합니다. ^^

User Account Control Prompts on the Secure Desktop
; https://learn.microsoft.com/en-us/archive/blogs/uac/user-account-control-prompts-on-the-secure-desktop
kevin25
2011-05-18 08시32분
[guest] "Computer Configuration" / "Windows Settings" / "Security Settings" / "Local Policies" / "Security Options"
- User Account Control: Switch to the secure desktop when prompting for elevation
[guest]

... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13229정성태1/25/20235579.NET Framework: 2090. C# - UDP Datagram의 최대 크기
13228정성태1/24/20235682.NET Framework: 2089. C# - WMI 논리 디스크가 속한 물리 디스크의 정보를 얻는 방법 [2]파일 다운로드1
13227정성태1/23/20235294개발 환경 구성: 659. Windows - IP MTU 값을 바꿀 수 있을까요? [1]
13226정성태1/23/20235002.NET Framework: 2088. .NET 5부터 지원하는 GetRawSocketOption 사용 시 주의할 점
13225정성태1/21/20234155개발 환경 구성: 658. Windows에서 실행 중인 소켓 서버를 다른 PC 또는 WSL에서 접속할 수 없는 경우
13224정성태1/21/20234634Windows: 221. Windows - Private/Public/Domain이 아닌 네트워크 어댑터 단위로 방화벽을 on/off하는 방법
13223정성태1/20/20234779오류 유형: 838. RDP 연결 오류 - The two computers couldn't connect in the amount of time allotted
13222정성태1/20/20234449개발 환경 구성: 657. WSL - DockerDesktop.vhdx 파일 위치를 옮기는 방법
13221정성태1/19/20234660Linux: 57. C# - 리눅스 프로세스 메모리 정보파일 다운로드1
13220정성태1/19/20234723오류 유형: 837. NETSDK1045 The current .NET SDK does not support targeting .NET ...
13219정성태1/18/20234380Windows: 220. 네트워크의 인터넷 접속 가능 여부에 대한 판단 기준
13218정성태1/17/20234267VS.NET IDE: 178. Visual Studio 17.5 (Preview 2) - 포트 터널링을 이용한 웹 응용 프로그램의 외부 접근 허용
13217정성태1/13/20234855디버깅 기술: 185. windbg - 64비트 운영체제에서 작업 관리자로 뜬 32비트 프로세스의 덤프를 sos로 디버깅하는 방법
13216정성태1/12/20235114디버깅 기술: 184. windbg - 32비트 프로세스의 메모리 덤프인 경우 !peb 명령어로 나타나지 않는 환경 변수
13215정성태1/11/20236838Linux: 56. 리눅스 - /proc/pid/stat 정보를 이용해 프로세스의 CPU 사용량 구하는 방법 [1]
13214정성태1/10/20236164.NET Framework: 2087. .NET 6부터 SourceGenerator와 통합된 System.Text.Json [1]파일 다운로드1
13213정성태1/9/20235623오류 유형: 836. docker 이미지 빌드 시 "RUN apt install ..." 명령어가 실패하는 이유
13212정성태1/8/20235529기타: 85. 단정도/배정도 부동 소수점의 정밀도(Precision)에 따른 형변환 손실
13211정성태1/6/20235482웹: 42. (https가 아닌) http 다운로드를 막는 웹 브라우저
13210정성태1/5/20234608Windows: 219. 윈도우 x64의 경우 0x00000000`7ffe0000 아래의 주소는 왜 사용하지 않을까요?
13209정성태1/4/20234496Windows: 218. 왜 윈도우에서 가상 메모리 공간은 64KB 정렬이 된 걸까요?
13208정성태1/3/20234489.NET Framework: 2086. C# - Windows 운영체제의 2MB Large 페이지 크기 할당 방법파일 다운로드1
13207정성태12/26/20224772.NET Framework: 2085. C# - gpedit.msc의 "User Rights Assignment" 특권을 코드로 설정/해제하는 방법파일 다운로드1
13206정성태12/24/20225009.NET Framework: 2084. C# - GetTokenInformation으로 사용자 SID(Security identifiers) 구하는 방법 [3]파일 다운로드1
13205정성태12/24/20225245.NET Framework: 2083. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용 (2)파일 다운로드1
13204정성태12/22/20224705.NET Framework: 2082. C# - (LSA_UNICODE_STRING 예제로) CustomMarshaler 사용법파일 다운로드1
... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...