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





필수 무결성 제어(신뢰도 등급)을 조절하는 방법(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에서 실행될 때는 다운이 되더라는 글을 어디선가 읽은 기억이 납니다.



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 3/31/2023]

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

비밀번호

댓글 작성자
 




1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13484정성태12/14/20232176개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232317닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20232918닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232293개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
13480정성태12/12/20232664개발 환경 구성: 692. Windows WSL 2 + Chrome 웹 브라우저 설치
13479정성태12/11/20232347개발 환경 구성: 691. WSL 2 (Ubuntu) + nginx 환경 설정
13477정성태12/8/20232542닷넷: 2182. C# - .NET 7부터 추가된 Int128, UInt128 [1]파일 다운로드1
13476정성태12/8/20232274닷넷: 2181. C# - .NET 8 JsonStringEnumConverter의 AOT를 위한 개선파일 다운로드1
13475정성태12/7/20232343닷넷: 2180. .NET 8 - 함수 포인터에 대한 Reflection 정보 조회파일 다운로드1
13474정성태12/6/20232185개발 환경 구성: 690. 닷넷 코어/5+ 버전의 ilasm/ildasm 실행 파일 구하는 방법 - 두 번째 이야기
13473정성태12/5/20232396닷넷: 2179. C# - 값 형식(Blittable)을 메모리 복사를 이용해 바이트 배열로 직렬화/역직렬화파일 다운로드1
13472정성태12/4/20232218C/C++: 164. Visual C++ - InterlockedCompareExchange128 사용 방법
13471정성태12/4/20232295Copilot - To enable GitHub Copilot, authorize this extension using GitHub's device flow
13470정성태12/2/20232597닷넷: 2178. C# - .NET 8부터 COM Interop에 대한 자동 소스 코드 생성 도입파일 다운로드1
13469정성태12/1/20232318닷넷: 2177. C# - (Interop DLL 없이) CoClass를 이용한 COM 개체 생성 방법파일 다운로드1
13468정성태12/1/20232258닷넷: 2176. C# - .NET Core/5+부터 달라진 RCW(Runtime Callable Wrapper) 대응 방식파일 다운로드1
13467정성태11/30/20232354오류 유형: 882. C# - Unhandled exception. System.Runtime.InteropServices.COMException (0x800080A5)파일 다운로드1
13466정성태11/29/20232521닷넷: 2175. C# - DllImport 메서드의 AOT 지원을 위한 LibraryImport 옵션
13465정성태11/28/20232294개발 환경 구성: 689. MSBuild - CopyToOutputDirectory가 "dotnet publish" 시에는 적용되지 않는 문제파일 다운로드1
13464정성태11/28/20232421닷넷: 2174. C# - .NET 7부터 UnmanagedCallersOnly 함수 export 기능을 AOT 빌드에 통합파일 다운로드1
13463정성태11/27/20232379오류 유형: 881. Visual Studio - NU1605: Warning As Error: Detected package downgrade
13462정성태11/27/20232394오류 유형: 880. Visual Studio - error CS0246: The type or namespace name '...' could not be found
13461정성태11/26/20232418닷넷: 2173. .NET Core 3/5+ 기반의 COM Server를 registry 등록 없이 사용하는 방법파일 다운로드1
13460정성태11/26/20232366닷넷: 2172. .NET 6+ 기반의 COM Server 내에 Type Library를 내장하는 방법파일 다운로드1
13459정성태11/26/20232334닷넷: 2171. .NET Core 3/5+ 기반의 COM Server를 기존의 regasm처럼 등록하는 방법파일 다운로드1
13458정성태11/26/20232359닷넷: 2170. .NET Core/5+ 기반의 COM Server를 tlb 파일을 생성하는 방법(tlbexp)
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...