반응형
Elevate.h
Elevate.cpp
위 클래스를 이용하여 ShellExecWithElevation 함수를 이용하면 응용 프로그램도 관리자 권한으로 실행하도록
요청할 수 있다.
// Elevate.h: interface for the CElevate class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ELEVATE_H__E7B50ED2_9C9D_4C00_93E9_C9547465DEFA__INCLUDED_)
#define AFX_ELEVATE_H__E7B50ED2_9C9D_4C00_93E9_C9547465DEFA__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Windows Vista 이상 OS 에서 관리자 권한 상승을 위한 Class
// 제작 : acidpop.tistory.com
// 날짜 : 2012/02/28
#include <shellapi.h>
#include <shlobj.h>
typedef struct _TOKEN_ELEVATION {
DWORD TokenIsElevated;
} TOKEN_ELEVATION, *PTOKEN_ELEVATION;
#ifndef CSIDL_PROGRAM_FILES
#define CSIDL_PROGRAM_FILES 0x0026
#endif // CSIDL_PROGRAM_FILES
class CElevate
{
public:
CElevate();
virtual ~CElevate();
public:
// 특정 프로그램을 관리자 권한으로 실행 하기 위한 함수
BOOL ShellExecWithElevation(HWND hWnd, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory);
// 자기 자신을 관리자 권한으로 다시 시작 하는 함수
BOOL SelfExecuteWithElevation();
// 특정 Url 을 관리자 권한으로 Internet Explorer 를 실행 하는 함수
BOOL OpenUrlWithElevation(HWND hWnd, LPCTSTR lpUrl);
// 권한 상승이 필요한지 여부, 1 - UAC 미지원 OS, 2 - 상태 정보 조회 불가, 3 - 권한 상승 필요, 4 - 권한 상승 되어 있음
int GetNeedElevate();
// OS가 Vista 보다 상위 인지 여부
BOOL IsVistaOrHigher(void);
// 권한 체크
HRESULT IsElevated(BOOL *pElevated);
private:
// 관리자 권한으로 실행 하기 위한 가장 기초 함수,ShellExecWithElevation 를 사용하도록 권장
BOOL ShellExecWithVerb(HWND hWnd, LPCTSTR lpVerb, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory);
};
#endif // !defined(AFX_ELEVATE_H__E7B50ED2_9C9D_4C00_93E9_C9547465DEFA__INCLUDED_)
Elevate.cpp
// Elevate.cpp: implementation of the CElevate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Elevate.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CElevate::CElevate()
{
}
CElevate::~CElevate()
{
}
int CElevate::GetNeedElevate()
{
if (IsVistaOrHigher())
{
BOOL bResult = FALSE;
if (SUCCEEDED(IsElevated(&bResult)))
{
if (bResult == TRUE)
return 4; // 이미 Elevation이 완료됨
else
return 3; // Elevation이 필요함
}
else
return 2; // 상태 정보를 조회할 수 없음
}
return 1; // UAC가 지원되지 않는 운영체제로 판단함
}
BOOL CElevate::IsVistaOrHigher(void)
{
OSVERSIONINFO versionInfo;
versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&versionInfo) &&
versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
versionInfo.dwMajorVersion >= 6)
return TRUE;
else
return FALSE;
}
HRESULT CElevate::IsElevated(BOOL *pElevated)
{
HRESULT hResult = E_FAIL;
HANDLE hToken = NULL;
if (!IsVistaOrHigher())
return hResult;
if (!OpenProcessToken(
GetCurrentProcess(),
TOKEN_QUERY,
&hToken))
return hResult;
TOKEN_ELEVATION te = { 0 };
DWORD dwReturnLength = 0;
const int TokenElevation = 20;
if (GetTokenInformation(
hToken,
(TOKEN_INFORMATION_CLASS)TokenElevation,
&te,
sizeof(te),
&dwReturnLength))
{
hResult = te.TokenIsElevated ? S_OK : S_FALSE;
if (pElevated)
*pElevated = (te.TokenIsElevated != 0);
}
CloseHandle(hToken);
return hResult;
}
BOOL CElevate::ShellExecWithVerb(HWND hWnd, LPCTSTR lpVerb, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory)
{
SHELLEXECUTEINFO executeInfo;
memset(&executeInfo, 0, sizeof(executeInfo));
executeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
executeInfo.fMask = 0;
executeInfo.hwnd = hWnd;
executeInfo.lpVerb = lpVerb;
executeInfo.lpFile = lpPath;
executeInfo.lpParameters = lpParameters;
executeInfo.lpDirectory = lpDirectory;
executeInfo.nShow = SW_NORMAL;
return ShellExecuteEx(&executeInfo);
}
BOOL CElevate::ShellExecWithElevation(HWND hWnd, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory)
{
return ShellExecWithVerb(hWnd, _T("runas"), lpPath, lpParameters, lpDirectory);
}
BOOL CElevate::SelfExecuteWithElevation()
{
TCHAR pszPathName[_MAX_PATH] = "";
TCHAR lpParameter[1024] = "";
if(__argc > 1)
{
for(int i=1; i<__argc; i++)
{
_tcscat(lpParameter, __argv[i]);
_tcscat(lpParameter, " ");
}
}
::GetModuleFileName(::AfxGetInstanceHandle(), pszPathName, _MAX_PATH);
//PathRemoveFileSpec(pszPathName);
return ShellExecWithElevation(NULL, pszPathName, lpParameter, _T(""));
}
BOOL CElevate::OpenUrlWithElevation(HWND hWnd, LPCTSTR lpUrl)
{
_TCHAR lpBuffer[MAX_PATH + 1];
if (!SHGetSpecialFolderPath(hWnd, lpBuffer, CSIDL_PROGRAM_FILES, 0))
return FALSE;
_tcscat(lpBuffer, _T("\\Internet Explorer\\iexplore.exe"));
return ShellExecWithElevation(hWnd, lpBuffer, lpUrl, _T(""));
}
<SPAN id=tx_marker_caret></SPAN>위 클래스를 이용하여 ShellExecWithElevation 함수를 이용하면 응용 프로그램도 관리자 권한으로 실행하도록
요청할 수 있다.
'Programming > C/C++' 카테고리의 다른 글
| POSIX timer sample (0) | 2014.10.08 |
|---|---|
| 내 네트워크상의 모든 컴퓨터 이름 목록과 IP 주소 출력 (0) | 2012.12.20 |
| Text 마지막에서 10줄 읽어오기 (0) | 2012.11.19 |
| Visual Studio 2012 Thread Library 사용 (1) | 2012.08.21 |
| [c/c++] srand 사용시 주의사항 (0) | 2011.08.22 |
| VC Express. Dll 또는 Lib 프로젝트에서 버전을 표시 하자. (1) | 2009.08.11 |
| Visual Basic (VB) 에서 C DLL 사용하기(C DLL 을 ATL 로 편하게 포장) (0) | 2009.06.03 |
| 윈도우에서 C 계열 프로그래밍 할때 포인터 유효 검사. (0) | 2009.04.09 |