Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
(시리즈 글이 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





.NET에서의 필수 무결성 제어(신뢰도 등급) 조정 - Manifest 파일 이용


지난 토픽에서 이미 VC++ 개발자 입장에서 필수 무결성 제어(신뢰도 등급)을 조정하는 방법을 2가지 알아봤었습니다.

VC++: 필수 무결성 제어(신뢰도 등급)을 조절하는 방법(1) - Manifest 파일 이용 
; https://www.sysnet.pe.kr/2/0/445

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

그럼, ".NET"에서는 어떻게 다뤄질 수 있을까요? 우선, 필수 무결성 제어(신뢰도 등급)의 직접 코딩 방식은 아직 .NET 3.0에서 명시적으로 지원되지 않습니다. 향후의 .NET 3.5는 아직 개선중이라서 이에 대한 반영이 될지는 장담할 수 없지만, 현재 이용이 가능한 최선의 방법은 P/Invoke를 사용한 Win32 API의 호출 밖에는 없는 듯 보입니다.

반면에, "manifest"를 이용하는 방법은 VC++과 비슷한 수준에서 쉽게 구성할 수 있습니다. 일단, 이번 토픽에서는 .NET 코딩을 통한 필수 무결성 제어(신뢰도 등급) 향상은 생략하고, Manifest 파일을 통한 필수 무결성 제어(신뢰도 등급) 향상 방법에 대해서만 이야기를 해보겠습니다.




[Manifest 파일을 내장하는 방법]
1. VS.NET 2005에서 C# 콘솔 응용 프로그램 프로젝트를 생성합니다.

2. 다음과 같은 내용을 포함한 "UacManifest.RC" 파일을 생성합니다.(이름은 임의로 지어도 됩니다.)

#include <winuser.h>
#define IDR_MANIFEST 1 // 2 for a DLL

IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
{
    "<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">
       <asmv3:trustInfo xmlns:asmv3=""urn:schemas-microsoft-com:asm.v3"">
         <asmv3:security>
           <asmv3:requestedPrivileges>
             <asmv3:requestedExecutionLevel
               level=""requireAdministrator""
               uiAccess=""false"" />
           </asmv3:requestedPrivileges>
         </asmv3:security>
       </asmv3:trustInfo>
     </assembly>"
}

3. 위의 "UacManifest.RC" 파일을 "rc.exe" 리소스 컴파일러로 컴파일합니다. "rc.exe" 파일은 VS.NET 2005에서 VC++ 부분을 설치한 경우에 "C:\Program Files\Microsoft Visual Studio 8\VC\bin\rc.exe"로 존재하게 됩니다. 만약 VC++이 없는 상태라면, "Windows SDK"를 설치하시면 "C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\rc.exe"로 포함되어 있으니 그것을 사용하셔도 됩니다.

 C:>rc.exe UacManifest.RC

위와 같이 실행하게 되면 "uacmanifest.RES" 파일이 생성됩니다.

4. C# 프로젝트 속성창에서 3번 단계에서 생성된 "uacmanifest.RES" 파일을 다음과 같이 지정해 줍니다.

requestedExecutionLevel_manifest_1.png

5. 자, 완료되었습니다. ^^ 이제 빌드하고 실행시켜 보시면 해당 콘솔 응용 프로그램이 실행될 때마다 자동으로 "UAC 확인창"이 뜨는 것을 볼 수 있습니다.




[Manifest 내용을 외부 파일로 두는 방법]
위에서 살펴본 방식은 Manifest 파일을 내장하는 방법을 설명한 것입니다. VC++에서도 설명했듯이 manifest 파일은 리소스로 포함하는 방식과 외부 파일로 빼는 방식이 있는데, .NET 역시 manifest 파일을 외부로 빼는 방식이 가능합니다. 단지 VC++에서와 다른 점이 있다면, .NET 응용 프로그램의 경우에는 그냥 아무런 프로젝트 설정을 하지 않고도 exe 파일명에 ".manifest" 확장자만 붙인 별도의 파일을 두는 식으로 간단하게 해결된다는 점입니다.

하지만, 그와 같이 manifest 파일을 직접 수작업으로 관리해주는 것은 아무래도 ^^ 좀 원시적으로 보이죠. 기왕이면 프로젝트 속성창 단계에서 그와 같은 관리를 해주면 좋을 텐데, (Orcas에서는 바뀔지 모르지만) 직접적으로 Manifest 파일만을 위한 옵션은 제공되지 않고 "ClickOnce"를 위한 설정에 얹어서 가는 방법만이 제공되고 있습니다. 어쨌든, 그 방식이 나름대로는 편하니 마저 알아보도록 하겠습니다.

1. VS.NET 2005에서 C# 콘솔 응용 프로그램 프로젝트를 생성합니다.

2. 아래에서 보는 것처럼, 프로젝트 속성창의 "Security" 설정에서 "Enable ClickOnce Security Settings"를 선택해 둡니다.

net_manifest_settings_1.png

3. 위와 같이 선택해 두면, 프로젝트에 2가지 변화가 나타납니다. 첫번째는 "Properties" 폴더에 "Build Action"이 "BaseApplicationManifest" 값으로 설정된 "app.manifest" 항목이 생성되는 것을 확인할 수 있습니다.

net_manifest_settings_2.png

두번째는, csproj 프로젝트 파일을 직접 열어봐야만 확인이 가능한데, 아래에서 보는 것처럼 GenerateManifests 옵션값이 true로 설정된다는 점입니다.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    ;
    ;
    <GenerateManifests>true</GenerateManifests>
  </PropertyGroup>

이로 인해, app.config을 다루던 식과 비슷하게, 해당 프로젝트가 빌드되면 대상 폴더에 "app.manifest" 파일이 "ConsoleApplication1.exe.manifest" 파일로 이름이 바뀌어 생성되는 것을 확인할 수 있습니다.

4. UAC 확인창을 띄우기 위해서, "app.manifest" 파일을 열어서 다음과 같이 편집을 합니다.

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
      <requestedPrivileges> 
          <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

5. 자, 이제 모든 준비는 끝났습니다. 빌드하고 나서 "ConsoleApplication1.exe" 파일을 실행시키면 정상적으로 UAC 확인창이 뜨는 것을 확인할 수 있습니다.



첨부된 압축 파일은 여기서 설명된 예제 프로젝트를 포함하고 있습니다.

MyApp.zip: 내장 Manifest 파일 예제
ConsoleApplication1.zip: 외부 Manifest 파일 예제


[내용 추가: 2007-01-30]
예전에 COM 개체 등록을 대신하는 manifest에 대한 토픽을 쓴 적이 있었네요.
그냥 실습만 해보고 기록은 하지 않았다고 생각했었는데... ^^; 다음의 토픽을 참고하십시오.
Registry 등록 없이 COM 개체 사용 
; https://www.sysnet.pe.kr/2/1/262

Escape DLL Hell - Simplify App Deployment with ClickOnce and Registration-Free COM 
; https://learn.microsoft.com/en-us/archive/msdn-magazine/2005/april/simplify-app-deployment-with-clickonce-and-registration-free-com



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 1/9/2023]

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

비밀번호

댓글 작성자
 




... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11862정성태4/7/201920181개발 환경 구성: 437. .NET EXE의 ASLR 기능을 끄는 방법
11861정성태4/6/201919630디버깅 기술: 126. windbg - .NET x86 CLR2/CLR4 EXE의 EntryPoint
11860정성태4/5/201923501오류 유형: 527. Visual C++ 컴파일 오류 - error C2220: warning treated as error - no 'object' file generated
11859정성태4/4/201920722디버깅 기술: 125. WinDbg로 EXE의 EntryPoint에서 BP 거는 방법
11858정성태3/27/201921631VC++: 129. EXE를 LoadLibrary로 로딩해 PE 헤더에 있는 EntryPoint를 직접 호출하는 방법파일 다운로드1
11857정성태3/26/201919527VC++: 128. strncpy 사용 시 주의 사항(Linux / Windows)
11856정성태3/25/201919778VS.NET IDE: 134. 마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법 [1]파일 다운로드1
11855정성태3/25/201921952개발 환경 구성: 436. 페이스북 HTTPS 인증을 localhost에서 테스트하는 방법
11854정성태3/25/201917607VS.NET IDE: 133. IIS Express로 호스팅하는 사이트를 https로 접근하는 방법
11853정성태3/24/201920406개발 환경 구성: 435. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면? - 두 번째 이야기 [1]
11852정성태3/20/201919621개발 환경 구성: 434. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면?파일 다운로드1
11851정성태3/19/201923373Linux: 8. C# - 리눅스 환경에서 DllImport 대신 라이브러리 동적 로드 처리 [2]
11850정성태3/18/201922429.NET Framework: 813. C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유
11849정성태3/18/201921777.NET Framework: 812. pscp.exe 기능을 C#으로 제어하는 방법파일 다운로드1
11848정성태3/17/201918516스크립트: 14. 윈도우 CMD - 파일이 변경된 경우 파일명을 변경해 복사하고 싶다면?
11847정성태3/17/201922990Linux: 7. 리눅스 C/C++ - 공유 라이브러리 동적 로딩 후 export 함수 사용 방법파일 다운로드1
11846정성태3/15/201921638Linux: 6. getenv, setenv가 언어/운영체제마다 호환이 안 되는 문제
11845정성태3/15/201921766Linux: 5. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) [3]
11844정성태3/14/201923097개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정 [1]파일 다운로드1
11843정성태3/14/201918039기타: 75. MSDN 웹 사이트를 기본으로 영문 페이지로 열고 싶다면?
11842정성태3/13/201916396개발 환경 구성: 433. 마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법 [1]파일 다운로드1
11841정성태3/13/201916697VS.NET IDE: 132. Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
11840정성태3/13/201918321오류 유형: 526. 윈도우 10 Ubuntu App 환경에서는 USB 외장 하드 접근 불가
11839정성태3/12/201922274디버깅 기술: 124. .NET Core 웹 앱을 호스팅하는 Azure App Services의 프로세스 메모리 덤프 및 windbg 분석 개요 [3]
11838정성태3/7/201925892.NET Framework: 811. (번역글) .NET Internals Cookbook Part 1 - Exceptions, filters and corrupted processes [1]파일 다운로드1
11837정성태3/6/201939819기타: 74. 도서: 시작하세요! C# 7.3 프로그래밍 [10]
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...