CreateProcessWithLogonW

新しいプロセスとそのプライマリスレッドを作成する。次に、新しいプロセスは指定した資格情報(ユーザー、ドメイン、パスワード)のセキュリティコンテキストで指定した実行可能ファイルを実行する。任意で指定したユーザーのユーザープロファイルを読み込むこともできる。

CreateProcessWithLogonW lpUsername, lpDomain, lpPassword, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation

lpUsername : [wstr] ユーザーの名前。ログオンするユーザーアカウントの名前である。UPN 形式 user@DNS_domain_name を使用する場合、lpDomain パラメータは NULL でなければならない。
lpDomain : [wstr] lpUsername アカウントを含むアカウントデータベースを持つドメインまたはサーバの名前。このパラメータが NULL の場合、ユーザー名は UPN 形式で指定する必要がある。
lpPassword : [wstr] lpUsername アカウントの平文パスワード。
dwLogonFlags : [int] 
lpApplicationName : [wstr] 実行するモジュールの名前。このモジュールは Windows ベースのアプリケーションでもよい。ローカルコンピュータで適切なサブシステムが利用可能であれば、MS-DOS や OS/2 などの他の種類のモジュールでもよい。
lpCommandLine : [wstr] 実行するコマンドライン。この文字列の最大長は 1024 文字である。lpApplicationName が NULL の場合、lpCommandLine のモジュール名部分は MAX_PATH 文字に制限される。関数はこの文字列の内容を変更することがある。したがって、このパラメータは読み取り専用メモリ(const 変数やリテラル文字列など)へのポインタであってはならない。このパラメータが定数文字列の場合、関数はアクセス違反を引き起こすことがある。lpCommandLine パラメータは NULL にでき、その場合、関数は lpApplicationName が指す文字列をコマンドラインとして使用する。lpApplicationName と lpCommandLine が両方とも NULL でない場合、*lpApplicationName が実行するモジュールを指定し、*lpCommandLine がコマンドラインを指定する。新しいプロセスは GetCommandLine を使用してコマンドライン全体を取得できる。C で書かれたコンソールプロセスは argc と argv 引数を使ってコマンドラインを解析できる。argv[0] はモジュール名であるため、C プログラマは通常コマンドラインの最初のトークンとしてモジュール名を繰り返す。lpApplicationName が NULL の場合、コマンドラインの最初の空白区切りトークンがモジュール名を指定する。空白を含む長いファイル名を使用する場合は、ファイル名の終わりと引数の始まりを示すために引用符で囲む(lpApplicationName パラメータの説明を参照)。ファイル名に拡張子が含まれない場合、.exe が付加される。したがって、ファイル名の拡張子が .com の場合、このパラメータには .com 拡張子を含める必要がある。拡張子のないピリオドで終わるファイル名、またはパスを含むファイル名の場合、.exe は付加されない。ファイル名にディレクトリパスが含まれない場合、システムは以下の順序で実行可能ファイルを検索する:
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 構造体へのポインタ。
lpProcessInformation : [var] プロセスへのハンドルを含む、新しいプロセスの識別情報を受け取る PROCESS_INFORMATION 構造体へのポインタ。

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

解説

新しいプロセスとそのプライマリスレッドを作成する。次に、新しいプロセスは指定した資格情報(ユーザー、ドメイン、パスワード)のセキュリティコンテキストで指定した実行可能ファイルを実行する。任意で指定したユーザーのユーザープロファイルを読み込むこともできる。

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

[備考]
既定では、CreateProcessWithLogonW は指定したユーザープロファイルを HKEY_USERS
レジストリキーに読み込まない。つまり、HKEY_CURRENT_USER
レジストリキー内の情報へのアクセスは、通常のインタラクティブログオンと整合しない結果をもたらすことがある。CreateProcessWithLogonW
を呼び出す前に、LOGON_WITH_PROFILE を使用するか LoadUserProfile
関数を呼び出してユーザーレジストリハイブを HKEY_USERS に読み込むのは呼び出し側の責任である。lpEnvironment
パラメータが NULL の場合、新しいプロセスは lpUserName
で指定したユーザーのプロファイルから作成された環境ブロックを使用する。HOMEDRIVE および HOMEPATH
変数が設定されていない場合、CreateProcessWithLogonW
は環境ブロックを変更してユーザーの作業ディレクトリのドライブとパスを使用する。作成されると、新しいプロセスとスレッドハンドルは完全なアクセス権
(PROCESS_ALL_ACCESS および THREAD_ALL_ACCESS)
を受け取る。いずれのハンドルについても、セキュリティ記述子が提供されない場合、ハンドルはその種類のオブジェクトハンドルを必要とする任意の関数で使用できる。セキュリティ記述子が提供された場合、アクセスが許可される前に、ハンドルの後続のすべての使用に対してアクセスチェックが実行される。アクセスが拒否されると、要求元プロセスはハンドルを使用してプロセスまたはスレッドへのアクセスを得ることができない。セキュリティトークンを取得するには、PROCESS_INFORMATION
構造体内のプロセスハンドルを OpenProcessToken
関数に渡す。プロセスにはプロセス識別子が割り当てられる。識別子はプロセスが終了するまで有効である。プロセスの識別、または
OpenProcess
関数でプロセスへのハンドルを開くために指定できる。プロセスの初期スレッドにもスレッド識別子が割り当てられる。OpenThread
関数でスレッドへのハンドルを開くために指定できる。識別子はスレッドが終了するまで有効で、システム内でスレッドを一意に識別するのに使用できる。これらの識別子は
PROCESS_INFORMATION
で返される。呼び出し元スレッドは、新しいプロセスが初期化を完了し入力保留なしでユーザー入力を待機する状態になるまで待つために
WaitForInputIdle 関数を使用できる。これは親プロセスと子プロセス間の同期に便利である。なぜなら
CreateProcessWithLogonW
は新しいプロセスが初期化を完了するのを待たずに復帰するからである。たとえば、作成元プロセスは新しいプロセスに関連付けられたウィンドウを見つけようとする前に
WaitForInputIdle を使用する。プロセスをシャットダウンする推奨方法は ExitProcess
関数を使用することである。なぜならこの関数はプロセスにアタッチされているすべての DLL
に終了の接近を通知するからである。プロセスをシャットダウンする他の手段はアタッチされた DLL に通知しない。スレッドが
ExitProcess を呼び出すと、プロセスの他のスレッドは(アタッチされた DLL
のスレッド終了コードを含む)追加コードを実行する機会なしに終了されることに注意。詳細は「Terminating a
Process」を参照のこと。CreateProcessWithLogonW
は対象ユーザーのセキュリティコンテキストで指定したディレクトリと実行可能イメージにアクセスする。実行可能イメージがネットワーク上にありパスにネットワークドライブ文字が指定されている場合、ネットワークドライブ文字はログオンごとに割り当てられるため、対象ユーザーには利用できない。ネットワークドライブ文字を指定している場合、本関数は失敗する。実行可能イメージがネットワーク上にある場合は
UNC パスを使用する。本関数で同時に作成して実行できる子プロセスの数には制限がある。たとえば Windows XP ではこの制限は
MAXIMUM_WAIT_OBJECTS*4
である。しかし、システム全体のクォータ制限により、これだけの数のプロセスを作成できない場合がある。Windows XP
SP2、Windows Server 2003 以降: "LocalSystem" アカウントで実行されているプロセスからは
CreateProcessWithLogonW を呼び出せない。これは、本関数が呼び出し元トークン内のログオン SID
を使用し、"LocalSystem" アカウントのトークンにはこの SID
が含まれないためである。代替として、CreateProcessAsUser および LogonUser
関数を使用する。この関数を使用するアプリケーションをコンパイルするには、_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