본문 바로가기
IT-개발,DB

[개발/VC++] MFC 관리자권한 외부 프로세스 실행을 위한 소스

by SB리치퍼슨 2011. 3. 8.

외부 프로세스 실행을 위한 소스
아래 함수는 Windows 7 에서 관리자 권한으로 실행이 가능하게 하는 코드이다.
MFC 개발하시분 분들에게는 많이 유용할 것이다.
쌈꼬쪼려 소백촌닭

=======================================================
사례1

// 프로세스 실행
BOOL SBRICH::ExecuteProcess(CString FilePath, CString Parameter)

 //TCHAR path[1024] = {0,};
 //::GetModuleFileName(NULL, path, 1024);
 BOOL bRes = FALSE;

 if(OSVersionXPOver())
 {
  // 관리자 모드로 실행
  SHELLEXECUTEINFO exeInfo = {0,};

  exeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  exeInfo.hwnd = NULL;
  exeInfo.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
  exeInfo.lpVerb = _T("runas");
  exeInfo.lpFile = FilePath;
  exeInfo.lpParameters = Parameter;
  exeInfo.nShow = SW_SHOWNORMAL;

  bRes = ::ShellExecuteEx(&exeInfo);

 }
 else
 {
  //xp 이하이므로 그냥 호출.
  if( ::ShellExecute(NULL, _T("open"), FilePath, Parameter, NULL, SW_SHOW) == (HINSTANCE)HINSTANCE_ERROR)
   bRes = FALSE;
  else
   bRes = TRUE;
 }

 return bRes;
}


===================================================================
사례2

// 프로세스 실행
BOOL SBRICH::ExecuteProcess(CString FilePath, CString Parameter)

 //TCHAR path[1024] = {0,};
 //::GetModuleFileName(NULL, path, 1024);
 BOOL bRes = FALSE;

 if(OSVersionXPOver())
 {
  // 관리자 모드로 실행
  CString sRun;
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.lpDesktop = "winsta0\\default";
  ZeroMemory(&pi, sizeof(pi));

  sRun = FilePath;
  sRun += Parameter;
  // start the child process
  if (!CreateProcess(NULL, // no module name (use command line)
   (LPSTR)(LPCSTR)sRun, // Command line
   NULL, // Process handle not inheritate
   NULL, // Thread handle not inheritate
   FALSE, // Set handle inheritance to FALSE
   0, // No creation flags
   NULL, // Use parent's environment block
   NULL, // Use parent's starting directory
   &si, // Pointer STARTUPINFO structure
   &pi) // Pointer to PROCESS_INFORMATION structure
   )
  {
#ifdef _DEBBUG
   fprintf(Filelog, "CreateProcess Failed (%d)\n", GetLastError());
   Filelog.flush();
#endif
   return FALSE;
  }
  // wait until child process exits
  WaitForSingleObject(pi.hProcess, INFINITE);
  // Close process and thread handles;
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);   


 }
 else
 {
  //xp 이하이므로 그냥 호출.
  if( ::ShellExecute(NULL, _T("open"), FilePath, Parameter, NULL, SW_SHOW) == (HINSTANCE)HINSTANCE_ERROR)
   bRes = FALSE;
  else
   bRes = TRUE;
 }

 return bRes;
}

반응형

댓글