천객만래 [千客萬來] (It has an interminable succession of visitors)

외부 프로세스 실행을 위한 소스
아래 함수는 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;
}

Posted by SB패밀리

외부 프로세스 실행을 위한 소스
아래 함수는 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;
}

Posted by SB패밀리

외부응용프로그램 실행하기 (Process.Start 메서드)


윈도우를 종료
System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -s -f -t 00");


윈도우를 재부팅

System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -r -f -t 00");

 

특정 폴더 열기
System.Diagnostics.Process.Start("explorer.exe", "C:\\Temp");

특정 사이트 열기
System.Diagnostics.Process.Start("explorer.exe", "http://www.naver.com");

 

도스명령어 실행

System.Diagnostics.Process.Start("cmd.exe","/c dir");

// cmd 옵션에 대해 더 알고싶으면.. c:\>help cmd

 

Process.Start 메서드 사용형식
 

using System.Diagnostics;

//System.Diagnostics 네임스페이스는 시스템 프로세스, 이벤트 로그 및 성능 카운터와 상호 작용할 수 있는 클래스를 제공합니다.

 

public bool Start();
//이 Process 구성 요소의 StartInfo 속성으로 지정된 프로세스 리소스를 시작하거나 다시 사용하여 구성 요소에 연결합니다.

 

Process myProcess = new Process();
string myDocumentsPath =   Environment.GetFolderPath(Environment.SpecialFolder.Personal);
myProcess.StartInfo.FileName = myDocumentsPath + "
\\MyFile.doc";
myProcess.StartInfo.Verb = "Print";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();

 

public static Process Start( ProcessStartInfo startInfo);
// ProcessStartInfo : 파일 이름 및 모든 명령줄 인수를 포함하여 프로세스를 시작하는 데 사용되는 정보
// 시작할 프로세스의 파일 이름 같은 프로세스 시작 정보가 포함된 매개 변수에 의해 지정된
// 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

 

ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
startInfo.Arguments = "
www.naver.com";
Process.Start(startInfo);

 

public static Process Start(string fileName);
// fileName : 프로세스에서 실행될 응용 프로그램 파일 이름입니다.

//문서 또는 응용 프로그램 파일 이름을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

 

Process.Start("IExplore.exe");

 

public static Process Start(string fileName, string arguments);
// arguments : 프로세스를 시작할 때 전달할 명령줄 인수입니다

//응용 프로그램 이름 및 명령줄 인수 집합을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다.

 

Process.Start("IExplore.exe", "C:\\myPath\\myFile.htm");
Process.Start("IExplore.exe", "C:\\myPath\\myFile.asp");

 

 

Process 클래스

Process 구성 요소는 컴퓨터에서 실행 중인 프로세스에 대한 액세스를 제공합니다. 간단히 말해 프로세스란 실행 중인 응용 프로그램을 말합니다.

 

Process 구성 요소는 응용 프로그램의 시작, 중지, 제어 및 모니터링을 위한 유용한 도구입니다.
Process 구성 요소를 사용하면 실행 중인 프로세스의 목록을 얻거나 새로운 프로세스를 시작할 수 있습니다. 또한 Process 구성 요소를 사용하여 시스템 프로세스에도 액세스할 수 있습니다.
Process 구성 요소를 초기화한 후에는 해당 구성 요소를 사용하여 실행 중인 프로세스에 대한 정보를 얻을 수 있으며 그러한 정보에는 스레드 집합, 로드된 모듈(.dll 및 .exe 파일), 프로세스가 사용하고 있는 메모리 양과 같은 성능 정보 등이 포함됩니다.

 

프로세스 구성 요소는 속성 그룹에 대한 정보를 한 번에 가져옵니다. Process 구성 요소가 특정 그룹의 한 멤버에 대한 정보를 가져올 때 해당 그룹의 나머지 속성 값이 캐싱되므로 Refresh 메서드를 호출하지 않는 한 그룹의 다른 멤버에 대한 새로운 정보를 가져오지 않습니다. 따라서 속성 값이 Refresh 메서드를 마지막으로 호출하여 얻은 속성 값과 같을 수 있습니다. 이러한 그룹 명세는 운영 체제에 따라 다릅니다.

 

더 자세한 사항은 Microsoft Visual Studio .NET 2003 도움말에서 Process 클래스를 참고하세요.

출처 : http://blog.naver.com/tear230/100002921976

쌈꼬쪼려 소백촌닭
Posted by SB패밀리


XP 이상 O/S는 사용자 계정 컨트롤(UAC) 라는게 기본설정으로 존제한다.
강화된 보안정책으로 어떠한 행동을 할때 권한을 얻고 해라 라는 형식이다.
일반적으로 어느정도 O/S를 다룰줄 아는 사람은 이부분을 권한 설정을 끈다.
하지만 그렇게 못하는 사람도 있기 때문에 프로그램을 만들때
관리자 권한을 획득한 상태로 프로그램을 실행 시켜야한다.

- ShellExecute 를 사용 하는 방법

if(IsUserAnAdmin() == FALSE) //프로그램이 관리자 권한인지 알 수 있는 함수
{
 //관리자 권한으로 실행 시킨다.
 SHELLEXEGUTEINFO si
 ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));

 si.cbSize = sizeof(SHELLEXECUTEINFO);
 si.hwnd = NULL;
 si.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
 si.lpVerb = _T("runas");
 si.lpFile = _T("프로그램명");
 si.lpParameters = _T("파라미터");
 si.nShow = SW_SHOWNORMAL;
 si.lpDirectory  = NULL;

 ShellExecuteEx(&si);
}

 

- Visual C++ 2008 일 경우 설정

 

 Project > Properties 메뉴를  선택
 Linker > Manifest File 항목에서
 Enable User Account Control (UAC)를 Yes로 설정하고
 UAC Execution Level을 requireAdministrator로 설정한다.

 

- 매니페스트 파일 생성


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <assemblyIdentity version="1.00.0"

     processorArchitecture="X86"

     name="IsUserAdmin"                       

     type="win32"/>

  <description>Description of your application</description>

  <!—어플리케이션 보안 요구 사항을 식별합니다. -->

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

    <security>

      <requestedPrivileges>

        <requestedExecutionLevel

          level="requireAdministrator"

          uiAccess="false"/>

        </requestedPrivileges>

       </security>

  </trustInfo>

</assembly>

 

위의 내용으로 manifest 라는 XML 파일을 생성한다.

name="IsUserAdmin" 여기에 실행파일 명을 명시!!!
level="requireAdministrator" 인 경우 관리자 권한으로 프로그램 실행됨.
level="asInvoker" 인 경우 부모 프로세스와 동일한 토큰으로 실행됨(경험적 결과이나 일반사용자 권한으로 실행됨)

 


위의 파일을 응용프로그램 안으로 통합하는 방법은 여기  http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx  를 참고하십시오

Posted by SB패밀리