C++ 別ユーザでプロセスを起動する
ユーザーアカウント制御の導入によりEXEファイルの実行に、ユーザ許可が必要になった。
Administrator権限を持つユーザで実行する事により、ユーザーアカウント制御の許可を必要とせずに実行する。
前提条件
- Visual Studio - Visual C++ - Win32コンソールアプリケーション
- 引数で指定するユーザはAdministrator権限を持つユーザ
- RunasExec.exe ユーザ名 パスワード ファイルパス で実行
RunasExec.cpp
#include "stdafx.h" #include <Windows.h> #include <string> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { if (argc < 4) { // 異常終了 return 9; } // 引数の値を取得 wstring userName = argv[1]; wstring password = argv[2]; wstring filePath = argv[3]; STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory( &sinfo, sizeof( STARTUPINFO ) ); ZeroMemory( &pinfo, sizeof( PROCESS_INFORMATION ) ); sinfo.cb = sizeof( STARTUPINFO ); // 別ユーザでプロセス起動 if (!CreateProcessWithLogonW( userName.c_str(), // ユーザ名 NULL, // ドメイン名 password.c_str(), // パスワード 0, // ログオン オプション NULL, // 実行可能モジュール名 (LPWSTR) filePath.c_str(), // ファイルパス CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, // 作成フラグ NULL, // 新しい環境ブロック NULL, // カレントディレクトリの名前 &sinfo, &pinfo)) { // 異常終了 return 9; } CloseHandle(pinfo.hThread); CloseHandle(pinfo.hProcess); // 正常終了 return 0; }