블로그 이미지
smstock

카테고리

분류 전체보기 (54)
취미 (8)
공부 (32)
낙서장 (12)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

태그목록

최근에 올라온 글

if(IsUserAnAdmin())
{

// 관리자 권한으로 실행중

}
else
{

// 아닐 경우 관리자 권한으로 프로그램 실행

SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));

si.cbSize = sizeof(SHELLEXECUTEINFO);
si.hwnd = NULL;
si.fMask = SEE_MASK_FLAG_DDEWAIT;
si.lpVerb = "runas";
si.lpFile = "Launcher.exe";
si.lpParameters = lpCmdLine;
si.nShow = SW_SHOWNORMAL;
si.lpDirectory = 0;

ShellExecuteEx(&si);
exit(0);

}

Posted by smstock
, |

Administrators 권한이 있는 경우에만 정상적으로 수행될 수 있는 어플리케이션을 만들기 위해서는 manifest를 이용하여 '이 프로그램을 수행하기 위해서는 반드시 권한상승이 필요하다'는 정보를 실행파일에 포함시킬 필요가 있습니다.

물론, 오른마우스를 클릭해서 "관리자 권한으로 실행" 으로 어플리케이션을 수행하거나, '속성'에서 '관리자 권한으로 이 프로그램 실행'을 선택할 수도 있겠지만, 사용자에게 이렇게 어플리케이션을 수행할 것을 강요하는 것은 매우 어려운 일이기 때문에, 실행파일 자체에 '이 어플리케이션은 반드시 Administrators permission이 필요하다' 라는 정보를 추가하여, 자동적으로 권한상승 창이 뜰 수 있도록 하는 것은 매우 중요합니다. 그런데 Visual Studio 2005 조차도 이러한 정보를 단숨에 실행파일에 추가하는 손쉬운 방법을 제공하지는 않습니다. (1. 아래 내용을 보면 아시겠지만 그렇다고 매우 복잡한것도 아닙니다. 2. 한편으로 보면 이는 매우 당연합니다. Visual Studio 2005가 Vista보다 미리 출시되었을 뿐더러 이러한 manifest를 추가하는 것은 단순히 특수한 type의 resource를 추가하는 것 이상의 동작이 아니기 때문입니다.) 게다가 managed code를 개발하느냐 혹은 C/C++와 같이 native code를 개발하느냐에 따라 그 방법이 서로 상이하기 때문에 조금은 혼돈스러울 수 있습니다.

앞서 말한 이러한 제약사항(본 어플리케이션은 반드시 Administrators 권한이 필요하다와 같은)은 manifest 라는 파일에 기록되게 되며, manifest 파일들은 실행파일에 추가(embedding)될 수 있습니다. manifest 파일의 일반적인 구조는 다음과 같습니다. 이 파일은 '실행파일명.exe.manifest' 라는 파일로 저장하는 것이 좋습니다. 'MyApp.exe'가 실행파일명이라면 'MyApp.exe.manifest'로 저장하시면 됩니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="IsUserAdmin"
type="win32"/>

<description>Description of your application</description> 
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

(indentation을 못해서 죄송합니다. 어떻게 하는지를 모르겠어요 ^^;)

 

이제 실질적인 3가지 절차를 알아 봅시다.  

 

1. 'Step by Step' 방법

 

먼저 '실행파일명.rc' 라는 이름의 빈파일을 만듭니다. 'MyApp.rc'와 같이 만들면 됩니다. 아래와 같은 내용을 적습니다.

#define RT_MANIFEST 24 
#define APP_MANIFEST 1

APP_MANIFEST RT_MANIFEST MyApp.exe.manifest

위 의미는 RT_MANIFEST 형 resource로 APP_MANIFEST 라는 이름의 identifier를 "MyApp.exe.manifest" 라는 내용을 정의한다라는 의미입니다.(manifest 형 resource 구분자의 값은 항상 1로 정의하는 것이 좋습니다.

(참고적으로 파일내에 RT_MANIFEST 를 정의하는 대신 #include <winuser.h> 를 포함시키는 것도 좋은 방법입니다. 하지만 이 경우 winuser.h 파일의 위치를 정의하기 위하여 추가적인 명령들을 설정해야할 수 있습니다. 또한 MyApp.exe.manifest 파일을 rc 파일과 분리된 파일로 두지 않고 rc 파일내에 쓸 수도 있습니다.)

이제 rc 파일을 컴파일하여 res 파일을 만듭니다. 컴파일 하는 방법은 다음과 같은 두가지 방법 중 한가지를 사용하면 됩니다.

  • command line prompt 에서 rc.exe /r MyApp.rc 를 입력합니다.
  • Visual Studio 2005 내에서 project properties를 선택하고 Build Event Tab의 Pre-Build event에 다음을 입력합니다.

"$(DevEnvDir)..\..\SDK\v2.0\bin\rc.exe" /r "$(ProjectDir)$(TargetName).rc"

(rc.exe 파일의 위치는 적절히 수정되어야할 수 있습니다.)

이제 컴파일된 resource를 실행파일에 추가하기 위한 절차를 수행합니다. 다음과 같은 2가지 방법이 있을 수 있습니다.

  • Visual Studio 2005나 MsBuild를 이용하는 방법

MyApp.csproj 파일을 열어서 볼드체로 표시된 내용을 다음과 같이 추가합니다.

<PropertyGroup>

...
<Win32Resource>MyApp.res</Win32Resource>

...
</PropertyGroup>

  • command line을 이용하여 컴파일 하는 방법

csc /win32res:MyApp.res MyApp.cs
vjc /win32res:MyApp.res MyApp.jsl
vbc /win32resource:MyApp.res MyApp.vb

 

2. mt.exe를 활용하는 방법

 

mt.exe 를 이용하면 이미 생성된 실행파일에 manifest 파일을 embedding할 수 있습니다. mt.exe를 활용하는 방법에도 2가지 방법이 있을 수 있습니다.

  • command prompt를 이용하여 다음과 같이 입력합니다.

mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;#1

여기서 #1 은 manfest 파일에 대한 resource identifier를 1로 정의한다는 의미입니다.

  • Visual Studio 2005 내에서 project properties를 선택하고 Build Event Tab의 Post-Build event에 다음을 입력합니다.

"$(DevEnvDir)..\..\VC\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  –outputresource:"$(TargetDir)$(TargetFileName)";#1

 

3. Manifest Tool을 이용하는 방법

 

Visual Studio 2005를 이용하여 C++ 어플리케이션을 개발하고 있다면, 좀 더 손쉽게 manifest 파일을 embedding할 수 있습니다.

project properties를 선택하고 Configuration Properties->Manifest Tool을 선택한 후, Input and Output을 선택합니다. Additional Manifest Files 에 'MyApp.exe.manifest' 와 같이 manifest 파일명을 입력하면 됩니다.

 

결론

이러한 3가지 방법중에 각각 선호하는 방법을 선택하면 되겠습니다만, 2번 방법을 이용하는 것이 가장 간단하면서도, managed/native의 구분없이 사용할 수 있으므로 가장 적절하지 않을까 생각됩니다.

 

다음 Link를 참고하십시오.

Developer Best Practices and Guidelines for Applications in a Least Privileged Environment

.Net Security Blog : Adding a UAC Manifest to Managed Code

The Moth: Vista: User Account Control

How To: Tell Vista's UAC What Privelege Level Your App Requires



출처 : http://himskim.egloos.com/1524155

Posted by smstock
, |

1. 현재 프로세스 종료 안시키고 실행

SHELLEXECUTEINFO si;  

ZeroMemory(&si, sizeof(si));

si.cbSize = sizeof(si);

si.lpFile = 실행파일명;

si.lpDirectory = 실행파일 경로;

si.nShow |= SW_SHOWNA;

si.lpParameters = (LPCSTR)보내고자할 파라미터 데이터;

    

if(!ShellExecuteEx(&si))        

{   

int res = GetLastError();        

if(res == ERROR_FILE_NOT_FOUND)

AfxMessageBox("프로그램을 찾을 수 없습니다.");

if(res == ERROR_PATH_NOT_FOUND)

AfxMessageBox("프로그램 경로가 올바르지 않습니다.");

if(res == ERROR_ACCESS_DENIED)

AfxMessageBox("프로그램 액세스가 거부되었습니다.");

return;

}


2. 현재 프로세스 종료시키고 실행

- 기존 프로세스의 기억 공간에 새로운 프로그램을 적재함으로써, 호출 프로세스를 변형(프로세스 식별번호 유지)

- 테스트 해보니 클래스의 소멸자 호출이 되지 않음(메모리 릭 발생 가능성 존재)


execl (char*path, char*argo, char*arg1,………,NULL) 

execv (char*path, char**argv) 
execlp(char*filename, char*argo, char*arg1,………,NULL) 
execvp(char*filename, char**argv) 
  
path        실행화일이 있는 곳까지의 전체 경로 이름 
argo         실행하고자 하는 프로그램 이름 
arg1~argn 실행하고자 하는 프로그램의 인수들 
avgv         실행하고자 하는 프로그램의 인수들의 배열 
filename    실행하고자 하는 프로그램 이름 




참조 

http://blog.naver.com/PostView.nhn?blogId=eyes0311&logNo=20009947817&redirect=Dlog&widgetTypeCall=true

http://blog.naver.com/PostView.nhn?blogId=shymusicko&logNo=90005695640


Posted by smstock
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함