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;
}