http://blog.naver.com/lastday1225/150015292896
환경: 난 VS8 닷넷2.0 랭귀지는 C# 을 사용하고 있다. 최대한 툴 사용해서 문제를 해결하고자 했다. 귀차니즘...
그러나 다른 툴들이나 c, c++은 별반 크게 다르지 않다.
(델파이도 된다고 하네요. 다 될거 같네요 ㅎㅎㅎ)
상황 :
1. 비스타에서 관리자 권한이 요구되는 응용프로그램들은 실행시 관리자 권한 토큰을 획득해야 한다.
2. 실행시 관리자 권한을 획득하는 프롬프트를 띄워주려면 실행 아이콘에 쉴드를 달아주면 된다.
3. 쉴드를 달려면 메니페스트 권한 상승 파일을 추가하여 주면 된다.
위와 같은 상황에서 메니페스트를 추가하는 방식이 여러가지가 있다.
하지만, 그 여러가지 방식중에 메니페스트 파일이 동일 폴더에 없을경우 쉴드가 사라지는 것도 있다.
방법을 알아보자.
1. 권한 상승을 나타내는 메니페스트를 만든다.
노트패드에 아래와 같은 xml을 작성하여 확장자를 메니페스트로 해주면 되겠다.
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
위에서 레벨을 알맞는 레벨로 설정해주면 되는데 권한의 종류와 세부내용은 알아서 찾아보라.
2. 폴더를 생성하고 그 내부에 mt.exe파일, 해당 실행파일, 메니페스트 파일 이렇게 3가지를 넣는다.
3. 나의 경우는 배치 파일을 생성하여 메니페스트를 실행파일에 임베딩했는데,,
배치파일의 내용은 다음과 같다.
D:
cd D:\Documents and Settings\Administrator\바탕 화면\ManiFest MK
mt -manifest 해당파일.exe.manifest -outputresource:해당파일.exe;#1
^z
이라고 노트패드에 작성후에 확장자를 bat로 해주면 된다.
4. 배치파일을 실행한다.
5. 결과적으로 커맨드 창에서 위의 배치를 실행하는것과 같은 방식이나 경로를 할때마다 적어주는것에
귀차니즘을 느끼면 위와같이 하면된다.
이젠 실행파일 내부에 위의 권한상승 xml이 첨부 되었기에 메니페스트 파일은 필요가 없다.
ㅡㅡㅡ
두번째 방식으로
위의 방식과 같지만, VS8(2005)의 빌드 후 이벤트 란을 이용할수 있겠다.
첫째 방식의 1번 경우는 동일하고, 2번의 mt.exe는 경로 찾아 들어가서 쓰는 방식이 되겠다.
툴의 프로젝트 속성-빌드이벤트- 빌드후 이벤트 명령줄에 들어가면
커맨드 창에서의 명령을 빌드 후에 실행하게 된다.
"$(DevEnvDir)..\..\Common7\Tools\Bin\mt.exe" -manifest "$(TargetDir)$(TargetName).exe.manifest" -outputresource:$(TargetFileName)";#1
위의 명령은 필자가...아닌 필자의 팀장님께서 직접 수행하신 내용으로 ㅡㅡ; 믿을만하다.
외국의 한 MVP 출신의 블로거는 이 문장을 개판으로 해서 블로그에 올려서 나를 욕먹게 만들었다.
항상 의심하고 직접해봐야 하느니...
어쨌든 이렇게 하면 실행할때마다 수정된 exe 파일에 메니페스트가 임베딩 되시겠다.
ㅡㅡㅡ
세번째 방식은, 좀 아닌거 같다.
이 방식대로 했을경우에 메니페스트를 실행파일 폴더에서 제거할경우 쉴드아이콘이 사라진다. 개판이다...
위의 경우와 비슷한데 다른점이 있다면,
1. .rc 파일을 생성하여 그 내용에 아래와 같은 코드를 작성하여 프로젝트에 추가한다.
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST MyProject.exe.manifest
이후에 다시 툴의 빌드전 이벤트에
"$(DevEnvDir)..\..\SDK\v2.0\bin\rc.exe" /r "$(ProjectDir)$(TargetName).rc"
라고 입력한다.
빌드전에 리소스 생성이 되겠다.
2. 프로젝트명.csproj 파일을 편집모드로 열어서
</Project> 이놈이 닫히기 전에 아래코드를 끼워 넣는다.
<PropertyGroup><Win32Resource>ExeName.res</Win32Resource>
</PropertyGroup>
라고 추가한다. 물론 res네임은 프로젝트 네임으로 고쳐주는 센스는 있으리라 본다.
네번째 방법으론 툴지향적인 방식이다.
VS2008(코드네임 orcas)가 프리 사용? 버전으로 나왔다.
이놈의 기능중에 리소스 아이콘 추가 부분에 메니페스트 임베딩 기능이 추가 되었다.
말그대로 그냥 추가 클릭 하면 끝이다. .... 머냐 대체...
다섯번째 방법으로 클릭온스 기능이 되시겠다.
클릭온스 기능에서 인증서 만들고 두개의 메니패스트가 만들어지는데
하나는 응용메니페스트? 또 하나는 배포 메니페스트가 생성된다.
응용메니페스트에 권한상승 xml을 넣어주면 그걸로 오케이다.
근데, 메니페스트가 두개나 생기고 거기다 인증서도 생성해야하니 번거롭지 않은가..난 게으르다.
이하....로 알아낸 방식의 전부이다.
뭐 .. 결론적으로 이렇게 하면 되긴 하던데..
세번째 방식은 리소스와 메니페스트를 둘다 처리해 줘야 하기때문에
필자처럼 게을러터진 단순 코더는 이런일에도 스트레스를 받게 되므로 간단한 방식인 두번째 방식을 택했다.
개인적으로 위의 추가 방법들을 알아내기위해 영어라면 혀를 내두르며 싫어하는 필자가
영어에 눈을 뜨기 시작했다. 그것도 랭귀지니까...ㅡㅡ;
한글 사이트나 블로그에서 무진장 찾기 힘들어 그냥 작은 도움이나마 되길바라며 글을 써본다.
ㅡㅡ; 모두들 비스타와 대적할 힘을 기르자구요.
추신)사실 나만 알려고 하는 것들이 많이있다.
ㅡㅡ; 회사 팀장님이 나를 보고 "너같은 넘때문에 한국 IT가 발전이 없는거야" 라는 말씀을 하시길래
버럭 하는 마음에 키보드를 두들겨 본다.