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

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  144  145  [146]  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1403정성태1/14/201331970.NET Framework: 357. .NET 4.5의 2GB 힙 한계 극복
1402정성태1/14/201332505오류 유형: 166. SmtpClient.Send 오류 - net_io_connectionclosed
1401정성태1/11/201329836.NET Framework: 356. (공개키를 담은) 자바의 key 파일을 닷넷의 RSACryptoServiceProvider에서 사용하는 방법 [2]파일 다운로드1
1400정성태1/10/201329002Windows: 69. 작업표시줄의 터치 키보드(Touch Keyboard) 없애는 방법 [3]
1399정성태1/9/201324626.NET Framework: 355. 닷넷 환경이 왜 C/C++보다 느릴까요? [8]
1398정성태1/8/201325070오류 유형: 165. 새로 설치한 Visual Studio 2010의 Team Explorer 실행시 비정상 종료가 된다면?
1397정성태1/3/201328529Windows: 68. 윈도우 설치 ISO 이미지를 USB 하드에 적용하는 방법 [2]
1396정성태12/27/201229754사물인터넷: 2. 넷두이노 - 4.2.0 펌웨어 업데이트 방법 [1]파일 다운로드1
1395정성태12/26/201220615.NET Framework: 354. x64 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1394정성태12/25/201222056.NET Framework: 353. x86 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1393정성태12/25/201222451.NET Framework: 352. x64에서 필수로 지정하도록 바뀐 STAThread 특성 [2]
1392정성태12/21/201232458사물인터넷: 1. .NET Micro Framework - 넷두이노 플러스 [7]
1391정성태12/21/201225823.NET Framework: 351. JavaScriptSerializer, DataContractJsonSerializer, Json.NET [3]파일 다운로드1
1390정성태12/20/201223879.NET Framework: 350. String 데이터를 Stream으로 변환하는 방법 [2]
1389정성태12/12/201222208.NET Framework: 349. .NET Thread 인스턴스로부터 COM Apartment 유형 확인하는 방법파일 다운로드1
1388정성태12/12/201223289.NET Framework: 348. .NET x64 응용 프로그램에서 Teb 주소를 구하는 방법파일 다운로드1
1387정성태12/12/201228212VC++: 64. x64 Visual C++에서 TEB 주소 구하는 방법
1386정성태12/12/201229922디버깅 기술: 53. windbg - 덤프 파일로부터 네이티브 DLL을 추출하는 방법 [1]
1385정성태12/12/201224987디버깅 기술: 52. Windbg - The version of SOS does not match the version of CLR you are debugging.
1384정성태12/12/201229821개발 환경 구성: 178. System32 폴더의 64비트 DLL을 32비트 Depends.exe에서 보는 방법
1383정성태12/10/201225718개발 환경 구성: 177. 기업용 메신저를 위한 Office Communicator Server 2007 설치 [1]
1382정성태12/8/201228593개발 환경 구성: 176. WebPagetest 서버 - 설치 및 테스트
1381정성태12/5/201227058.NET Framework: 347. C# - 프로세스(EXE) 수준의 Singleton 개체 생성 [2]파일 다운로드1
1380정성태11/28/201237109.NET Framework: 346. 닷넷 개발자에게 Node.js의 의미 [17]
1379정성태11/26/201230246.NET Framework: 345. C# 부호(+, -)에 대한 비트 변환
1378정성태11/22/201231596Java: 14. 안드로이드 - Hello World 실습 [7]
... 136  137  138  139  140  141  142  143  144  145  [146]  147  148  149  150  ...