Microsoft MVP성태의 닷넷 이야기
VC++: 29. 필수 무결성 제어를 조절하는 방법(1) - Manifest 파일 이용 [링크 복사], [링크+제목 복사],
조회: 29183
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 4개 있습니다.)
(시리즈 글이 8개 있습니다.)
VC++: 29. 필수 무결성 제어를 조절하는 방법(1) - Manifest 파일 이용
; https://www.sysnet.pe.kr/2/0/445

VC++: 30. 필수 무결성 제어를 조절하는 방법(2) - 직접 코딩
; https://www.sysnet.pe.kr/2/0/446

VS.NET IDE: 43. .NET에서의 필수 무결성 제어 조절하는 방법 - Manifest 파일 이용
; https://www.sysnet.pe.kr/2/0/450

VS.NET IDE: 50. Orcas - UAC 설정 관련
; https://www.sysnet.pe.kr/2/0/507

개발 환경 구성: 320. Visual Basic .NET 프로젝트에서 내장 Manifest 자원을 EXE 파일로부터 제거하는 방법
; https://www.sysnet.pe.kr/2/0/11228

VS.NET IDE: 122. 비주얼 스튜디오에서 관리자 권한을 요구하는 C# 콘솔 프로그램 제작
; https://www.sysnet.pe.kr/2/0/11318

개발 환경 구성: 572. .NET에서의 필수 무결성 제어 - 외부 Manifest 파일을 두는 방법
; https://www.sysnet.pe.kr/2/0/12634

VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법
; https://www.sysnet.pe.kr/2/0/13304





필수 무결성 제어(MIC: Mandatory Integrity Control, 신뢰도 등급)을 조절하는 방법(1) - Manifest 파일 이용


Windows XP 시절에는 Manifest 파일을 거의 다루질 않았지요. Side-by-side 기능이 지원되는 DLL들을 사용한다거나, 아니면 COM 개체를 클라이언트 컴퓨터의 레지스트리에 등록하지 않고 사용하기 위한 경우에만 특별히 Manifest 파일을 다루곤 했었습니다.

개인적으로도, manifest 파일을 이용하면 COM 개체 등록이 필요 없어서 참 유용하다 싶어서 좀 해봤었는데요. 심지어 .NET 프로젝트에서도 COM 개체 참조를 하지 않고 COM 개체에 대한 manifest 파일을 참조하는 것이 가능해서 참 매력적으로 다가왔던 기술이었습니다. (그런데, 애석하게도 ASP.NET에서는 사용할 수가 없었습니다. IIS 7에서는 좀 바뀔지 모르겠지만... 혹시 ASP.NET에서 COM 개체 참조를 manifest 파일로만 하는 방법을 아는 분 계신가요? ^^) 일단은 이에 대해서는 나중에 시간날 때 다뤄 보도록 하고.

자, 이렇게 이전 Windows XP까지만 해도 manifest 파일은 사실 알아도 그만, 몰라도 그만이었는데요. 비스타가 나온 지금에는, UAC 확인창을 명시적으로 띄우기 위해서 이 "Manifest" 파일이 꼭 필요한 요소로 자리매김하게 되었습니다.

물론, 직접적인 코딩으로도 가능하지만. manifest 파일을 직접 다루는 것이 더 쉽기 때문에 아마도 많은 분들이 이 방식을 선호하시게 될 것 같습니다.

서론은 그만 두고. 직접 한번 같이 실습을 해볼까요? ^^ 미리 말씀드리면, manifest 파일은 exe 파일에 "리소스"로 포함하는 방법과, 외부 파일로 분리하는 방법으로 나뉘어 제공됩니다. 여기서는 그 두가지 방법 모두를 함께 알아보도록 하겠습니다.




1. VS.NET 2005를 이용해서 Visual C++ Win32 Console 프로젝트를 하나 만듭니다.

2. 해당 콘솔 프로젝트가 생성된 폴더에 다음과 같은 내용의 파일을 "add.manifest" 파일 이름으로 저장합니다. (파일명이나 폴더 경로는 임의로 정해도 됩니다.)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
    <ms_asmv2:security>
      <ms_asmv2:requestedPrivileges>
        <ms_asmv2:requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </ms_asmv2:requestedPrivileges>
       </ms_asmv2:security>
  </ms_asmv2:trustInfo>
</assembly>

3. 이제, 프로젝트 속성창에서 다음과 같이 "Additional Manifest Files"에 "add.manifest" 파일을 지정해 줍니다.

vcpp8_manifest_ext_int_1.png

4. 자, 모든 준비는 끝났습니다. 이제 빌드한 후 생성된 exe 파일을 실행시키면 "UAC 확인창"이 뜨는 것을 확인할 수 있습니다. 또한 친절하게도, 생성된 EXE 파일의 아이콘을 보게 되면 다음 화면과 같이 "관리자 권한"이 필요하다는 것을 알리는 방패 그림이 추가됩니다.

vcpp8_manifest_ext_int_3.png




위에서 설명한 방식이 manifest 파일을 리소스에 포함시킨 것입니다. 따라서, 이렇게 개발이 된 후에는 단일 exe 파일을 배포함으로써 동작이 가능하게 됩니다.

이제 방식을 달리해서, manifest 파일을 리소스로 포함하지 않고 외부로 빼도록 해보겠습니다. 방법은 매우 간단합니다. 다음 화면과 같이 manifest 파일을 외부에 지정하도록 프로젝트 속성창에서 "Embed Manifest" 옵션을 조정해 준 후 빌드를 해주면 끝입니다.

vcpp8_manifest_ext_int_2.png

그러면, "출력 폴더"에 다음과 같이 manifest 파일을 포함하고 있는 것을 확인할 수 있습니다.

vcpp8_manifest_ext_int_4.png

즉, 이렇게 되면 배포도 "UacWin32Console.exe", "UacWin32Console.exe.manifest" 파일을 모두 배포해 줘야 합니다. 어느 것을 선택해야 하는지는 여러분들의 응용 프로그램 배포 요구 사항에 의존할 것입니다.

* 첨부 파일은 위의 실습을 포함한 예제 프로젝트입니다.


[내용 수정: 2007-02-08]
trustInfo 노드에 이름없는 기본 네임스페이스 방식을 취하지 않고 ms_asmv2 네임스페이스 이름을 지정해 준 것은 나름대로 이유가 있습니다. 이에 대해서는 다음의 토픽을 참고하십시오.

Exploring Manifests Part 2: Default Namespaces and UAC Manifests in Windows Vista 
; https://techcommunity.microsoft.com/t5/windows-blog-archive/exploring-manifests-part-2-default-namespaces-and-uac-manifests/ba-p/228416
지금은 XP에 패치가 된 것으로 알고 있는데, 그 이전에는 위와 같은 문제로 인해서 동일한 프로그램이 XP에서 실행될 때는 다운이 되더라는 글을 어디선가 읽은 기억이 납니다.



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/15/2024]

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

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  190  191  192  193  194  [195]  ...
NoWriterDateCnt.TitleFile(s)
63정성태10/3/200422986.NET Framework: 14. Response.Cookies.Clear는 기존 설정된 Cookie 헤더를 삭제하는 것이 아닙니다.
62정성태10/3/200421968기타: 7. DB 트랜잭션에서 Lock이 걸릴 수 있는 전형적인 예.
61정성태10/3/200421508.NET Framework: 13. Main 메서드에 붙은 STAThread 의미
60정성태10/3/200420243.NET Framework: 12. IDispatch::GetIDsOfNames 역변환 메서드 작성 힌트 ( DISPID 로 메서드 이름 알아내는 것 )
58정성태10/3/200423340.NET Framework: 11. HttpContext의 간략이해
56정성태10/3/200419858.NET Framework: 10. [.NET 리모팅] 원격개체를 호출한 클라이언트의 연결이 유효한지 판단하는 방법.
55정성태10/3/200420618COM 개체 관련: 11. 내가 생각해 보는 COM의 현재 위치
54정성태8/30/200426286VC++: 10. 내가 생각해 보는 MFC OCX와 ATL DLL에 선택 기준
53정성태11/20/200525620VC++: 9. CFtpFileFind/FtpFileFind가 일부 Unix FTP 서버에서 목록을 제대로 못 가져오는 문제
184정성태11/23/200519287    답변글 VC++: 9.1. FTP 관련 토픽파일 다운로드1
51정성태6/24/200424195VC++: 8. BSTR 메모리 할당 및 해제(MSDN Library 발췌) [1]
50정성태6/16/200417476기타: 6. 1차 데스크톱 컴퓨터 사양
49정성태6/16/200417941기타: 5. 53만 원대 Second PC 마련. ^^
48정성태3/2/200419843.NET Framework: 9. 윈도우즈 발전사를 모아 둔 사이트. [1]
47정성태11/14/200518312VS.NET IDE: 7. 한글 OS에서 Internet Explorer 6.0 with SP1의 UI 언어 바꾸는 방법
45정성태1/26/200417689기타: 4. MCAD 시험
44정성태1/26/200418506VS.NET IDE: 6. 터미널 서비스 포트 변경 ( 서버 및 클라이언트 )
46정성태1/26/200423602    답변글 VS.NET IDE: 6.1. Windows 2003 터미널 서비스 라이센스 서버 없이 접속
114정성태11/14/200515033    답변글 VS.NET IDE: 6.2. [터미널 서버 라이센스] : 활성화 시 오류
43정성태12/23/200318231기타: 3. XP/2003 개인 방화벽 설정파일 다운로드1
40정성태7/23/200321701COM 개체 관련: 10. IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화 되는 문제 해결 [1]
41김성현7/24/200320520    답변글 COM 개체 관련: 10.1. [답변]: IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화 되는 문제 해결
42정성태7/29/200318408        답변글 COM 개체 관련: 10.2. feedback 을 받기 위해서 답변 기능을 가능하게 해두었습니다.
39정성태7/17/200324160VS.NET IDE: 5. 원격 제어 3가지 방법
38정성태7/17/200320723.NET Framework: 8. IIS 서버 재설치와 ASP.NET 서비스의 문제점
36정성태7/17/200321418.NET Framework: 7. 시행착오 - WebService 참조 추가 오류
... 181  182  183  184  185  186  187  188  189  190  191  192  193  194  [195]  ...