Microsoft MVP성태의 닷넷 이야기
VC++: 29. 필수 무결성 제어를 조절하는 방법(1) - Manifest 파일 이용 [링크 복사], [링크+제목 복사],
조회: 30849
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 61  62  63  64  65  [66]  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12323정성태9/11/202018304오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202021898개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/202016954오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202019561개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/202018474오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/202017218오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202021150개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202018804디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202021266개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202021466오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
12313정성태9/6/202021023개발 환경 구성: 509. Logstash - 사용자 정의 grok 패턴 추가를 이용한 IIS 로그 처리
12312정성태9/5/202028183개발 환경 구성: 508. Logstash 기본 사용법 [2]
12311정성태9/4/202020522.NET Framework: 937. C# - 간단하게 만들어 보는 리눅스의 nc(netcat), json_pp 프로그램 [1]
12310정성태9/3/202019795오류 유형: 644. Windows could not start the Elasticsearch 7.9.0 (elasticsearch-service-x64) service on Local Computer.
12309정성태9/3/202018477개발 환경 구성: 507. Elasticsearch 6.6부터 기본 추가된 한글 형태소 분석기 노리(nori) 사용법
12308정성태9/2/202020946개발 환경 구성: 506. Windows - 단일 머신에서 단일 바이너리로 여러 개의 ElasticSearch 노드를 실행하는 방법
12307정성태9/2/202021847오류 유형: 643. curl - json_parse_exception / Invalid UTF-8 start byte
12306정성태9/1/202018465오류 유형: 642. SQL Server 시작 오류 - error code 10013
12305정성태9/1/202020903Windows: 172. "Administered port exclusions"이 아닌 포트 범위 항목을 삭제하는 방법
12304정성태8/31/202019314개발 환경 구성: 505. 윈도우 - (네트워크 어댑터의 우선순위로 인한) 열거되는 IP 주소 순서를 조정하는 방법
12303정성태8/30/202019645개발 환경 구성: 504. ETW - 닷넷 프레임워크 기반의 응용 프로그램을 위한 명령행 도구 etrace 소개
12302정성태8/30/202019798.NET Framework: 936. C# - ETW 관련 Win32 API 사용 예제 코드 (5) - Private Logger파일 다운로드1
12301정성태8/30/202018761오류 유형: 641. error MSB4044: The "Fody.WeavingTask" task was not given a value for the required parameter "IntermediateDir".
12300정성태8/29/202019727.NET Framework: 935. C# - ETW 관련 Win32 API 사용 예제 코드 (4) CLR ETW Consumer파일 다운로드1
12299정성태8/27/202020148.NET Framework: 934. C# - ETW 관련 Win32 API 사용 예제 코드 (3) ETW Consumer 구현파일 다운로드1
12298정성태8/27/202020001오류 유형: 640. livekd - Could not resolve symbols for ntoskrnl.exe: MmPfnDatabase
... 61  62  63  64  65  [66]  67  68  69  70  71  72  73  74  75  ...