CreateProcessWithTokenW

新しいプロセスとそのプライマリスレッドを作成する。新しいプロセスは、指定したトークンのセキュリティコンテキストで動作する。任意で指定したユーザーのユーザープロファイルを読み込むこともできる。

CreateProcessWithTokenW hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation

hToken : [intptr] ユーザーを表すプライマリトークンへのハンドル。ハンドルは TOKEN_QUERY、TOKEN_DUPLICATE、TOKEN_ASSIGN_PRIMARY アクセス権を持っている必要がある。詳細は「Access Rights for Access-Token Objects」を参照のこと。トークンが表すユーザーは、lpApplicationName または lpCommandLine パラメータで指定されたアプリケーションに対して読み取りおよび実行アクセス権を持っている必要がある。
dwLogonFlags : [int] 
lpApplicationName : [wstr] 実行するモジュールの名前。このモジュールは Windows ベースのアプリケーションでもよい。ローカルコンピュータで適切なサブシステムが利用可能であれば、MS-DOS や OS/2 などの他の種類のモジュールでもよい。
lpCommandLine : [wstr] 実行するコマンドライン。
dwCreationFlags : [int] プロセスの作成方法を制御するフラグ。既定で CREATE_DEFAULT_ERROR_MODE、CREATE_NEW_CONSOLE、CREATE_NEW_PROCESS_GROUP フラグが有効になっている。値の一覧は「Process Creation Flags」を参照のこと。
lpEnvironment : [intptr] 新しいプロセスの環境ブロックへのポインタ。このパラメータが NULL の場合、新しいプロセスは lpUsername で指定したユーザーのプロファイルから作成された環境を使用する。
lpCurrentDirectory : [wstr] プロセスの現在のディレクトリへのフルパス。UNC パスも指定できる。このパラメータが NULL の場合、新しいプロセスは呼び出し元プロセスと同じ現在のドライブとディレクトリを持つ。(この機能は主に、アプリケーションを起動して初期のドライブと作業ディレクトリを指定する必要があるシェルのために提供されている。)
lpStartupInfo : [var] STARTUPINFO または STARTUPINFOEX 構造体へのポインタ。
lpProcessInformation : [var] プロセスへのハンドルを含む、新しいプロセスの識別情報を受け取る PROCESS_INFORMATION 構造体へのポインタ。

(プラグイン / モジュール : advapi32.dll)

解説

新しいプロセスとそのプライマリスレッドを作成する。新しいプロセスは、指定したトークンのセキュリティコンテキストで動作する。任意で指定したユーザーのユーザープロファイルを読み込むこともできる。

[戻り値]
関数が成功した場合、戻り値は 0 以外となる。関数が失敗した場合、戻り値は 0 となる。拡張エラー情報を取得するには
GetLastError を呼び出す。関数はプロセスの初期化が完了する前に復帰することに注意。必要な DLL
が見つからないか初期化に失敗した場合、プロセスは終了される。プロセスの終了ステータスを取得するには GetExitCodeProcess
を呼び出す。

[備考]
既定では、CreateProcessWithTokenW は指定したユーザーのプロファイルを HKEY_USERS
レジストリキーに読み込まない。つまり、HKEY_CURRENT_USER
レジストリキー内の情報へのアクセスは、通常のインタラクティブログオンと整合しない結果をもたらすことがある。本関数を呼び出す前に、LOGON_WITH_PROFILE
を使用するか LoadUserProfile 関数を呼び出してユーザーのレジストリハイブを HKEY_USERS
に読み込むのは呼び出し側の責任である。lpEnvironment パラメータが NULL の場合、新しいプロセスは lpUserName
で指定したユーザーのプロファイルから作成された環境ブロックを使用する。HOMEDRIVE および HOMEPATH
変数が設定されていない場合、CreateProcessWithTokenW
は環境ブロックを変更してユーザーの作業ディレクトリのドライブとパスを使用する。作成されると、新しいプロセスとスレッドハンドルは完全なアクセス権
(PROCESS_ALL_ACCESS および THREAD_ALL_ACCESS)
を受け取る。いずれのハンドルについても、セキュリティ記述子が提供されない場合、ハンドルはその種類のオブジェクトハンドルを必要とする任意の関数で使用できる。セキュリティ記述子が提供された場合、アクセスが許可される前に、ハンドルの後続のすべての使用に対してアクセスチェックが実行される。アクセスが拒否されると、要求元プロセスはハンドルを使用してプロセスまたはスレッドへのアクセスを得ることができない。セキュリティトークンを取得するには、PROCESS_INFORMATION
構造体内のプロセスハンドルを OpenProcessToken
関数に渡す。プロセスにはプロセス識別子が割り当てられる。識別子はプロセスが終了するまで有効である。プロセスの識別、または
OpenProcess
関数でプロセスへのハンドルを開くために指定できる。プロセスの初期スレッドにもスレッド識別子が割り当てられる。OpenThread
関数でスレッドへのハンドルを開くために指定できる。識別子はスレッドが終了するまで有効で、システム内でスレッドを一意に識別するのに使用できる。これらの識別子は
PROCESS_INFORMATION
で返される。呼び出し元スレッドは、新しいプロセスが初期化を完了し入力保留なしでユーザー入力を待機する状態になるまで待つために
WaitForInputIdle 関数を使用できる。これは親プロセスと子プロセス間の同期に便利である。なぜなら
CreateProcessWithTokenW
は新しいプロセスが初期化を完了するのを待たずに復帰するからである。たとえば、作成元プロセスは新しいプロセスに関連付けられたウィンドウを見つけようとする前に
WaitForInputIdle を使用する。プロセスをシャットダウンする推奨方法は ExitProcess
関数を使用することである。なぜならこの関数はプロセスにアタッチされているすべての DLL
に終了の接近を通知するからである。プロセスをシャットダウンする他の手段はアタッチされた DLL に通知しない。スレッドが
ExitProcess を呼び出すと、プロセスの他のスレッドは(アタッチされた DLL
のスレッド終了コードを含む)追加コードを実行する機会なしに終了されることに注意。詳細は「Terminating a
Process」を参照のこと。この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT を 0x0500
以上に定義する。詳細は「Using the Windows Headers」を参照のこと。セキュリティに関する注意事項
lpApplicationName パラメータは NULL にでき、その場合は実行可能名が lpCommandLine
内で最初の空白区切り文字列でなければならない。実行可能ファイルやパス名に空白が含まれると、関数が空白を解析する方法のために別の実行可能ファイルが実行されるリスクがある。次の例は危険である。なぜなら関数は
"MyApp.exe" の代わりに "Program.exe" が存在すればそれを実行しようとするからである。
(以下省略)

情報

プラグイン / モジュールadvapi32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の advapi32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_advapi32_gen2.hs