LogonUserExA 関数 (winbase.h)

LogonUserEx 関数は、ユーザーをローカル コンピューターにログオンしようとします。 ローカル コンピューターは、 LogonUserEx が呼び出されたコンピューターです。 LogonUserEx を使用してリモート コンピューターにログオンすることはできません。 ユーザー名とドメインを使用してユーザーを指定し、プレーンテキスト パスワードを使用してユーザーを 認証 します。 関数が成功すると、ログオンしているユーザーを表すトークンへのハンドルを受け取ります。 その後、このトークン ハンドルを使用して、指定したユーザーを偽装するか、ほとんどの場合、指定したユーザーのコンテキストで実行される プロセス を作成できます。

構文

BOOL LogonUserExA(
  [in]            LPCSTR        lpszUsername,
  [in, optional]  LPCSTR        lpszDomain,
  [in, optional]  LPCSTR        lpszPassword,
  [in]            DWORD         dwLogonType,
  [in]            DWORD         dwLogonProvider,
  [out, optional] PHANDLE       phToken,
  [out, optional] PSID          *ppLogonSid,
  [out, optional] PVOID         *ppProfileBuffer,
  [out, optional] LPDWORD       pdwProfileLength,
  [out, optional] PQUOTA_LIMITS pQuotaLimits
);

パラメーター

[in] lpszUsername

ユーザーの名前を指定する null で終わる文字列へのポインター。 これは、ログオン先のユーザー アカウントの名前です。 ユーザー プリンシパル名 (UPN) 形式のuser@DNS_domain_nameを使用する場合、lpszDomain パラメーターは NULL である必要があります。

[in, optional] lpszDomain

アカウント データベースに lpszUsername アカウントが含まれているドメインまたはサーバーの名前を指定する、null で終わる文字列へのポインター。 このパラメーターが NULL の場合、ユーザー名は UPN 形式で指定する必要があります。 このパラメーターが "." の場合、関数はローカル アカウント データベースのみを使用してアカウントを検証します。

[in, optional] lpszPassword

lpszUsername で指定されたユーザー アカウントのプレーンテキスト パスワードを指定する null で終わる文字列へのポインター。 パスワードの使用が完了したら、 SecureZeroMemory 関数を呼び出して、メモリからパスワードをクリアします。 パスワードの保護の詳細については、「パスワードの 処理」を参照してください。

[in] dwLogonType

実行するログオン操作の種類。 このパラメーターには、次の値のいずれかを指定できます。

意味
LOGON32_LOGON_BATCH
このログオンの種類は、プロセスがユーザーに代わって直接介入することなく実行されるバッチ サーバーを対象としています。 この種類は、メールや Web サーバーなど、一度に多数のプレーンテキスト認証の試行を処理するパフォーマンスの高いサーバー向けでもあります。 LogonUserEx 関数は、このログオンの種類の資格情報をキャッシュしません。
LOGON32_LOGON_INTERACTIVE
このログオンの種類は、 ターミナル サーバー、リモート シェル、または同様のプロセスによってログオンしているユーザーなど、コンピューターを対話的に使用するユーザーを対象としています。 このログオンの種類には、切断された操作のログオン情報をキャッシュする追加の費用がかかります。そのため、メール サーバーなどの一部のクライアント/サーバー アプリケーションでは不適切です。
LOGON32_LOGON_NETWORK
このログオンの種類は、ハイ パフォーマンス サーバーがプレーンテキスト パスワードを認証することを目的としています。 LogonUserEx 関数は、このログオンの種類の資格情報をキャッシュしません。
LOGON32_LOGON_NETWORK_CLEARTEXT
このログオンの種類では、 認証パッケージ内の名前とパスワードが保持されます。これにより、サーバーはクライアントを偽装しながら、他のネットワーク サーバーに接続できます。 サーバーは、クライアントからプレーンテキスト資格情報を受け入れ、 LogonUserEx を呼び出し、ユーザーがネットワーク経由でシステムにアクセスできることを確認し、引き続き他のサーバーと通信できます。
LOGON32_LOGON_NEW_CREDENTIALS
このログオンの種類により、呼び出し元は現在のトークンを複製し、送信接続の新しい資格情報を指定できます。 新しいログオン セッションは同じローカル識別子を持ちますが、他のネットワーク接続には異なる資格情報を使用します。

このログオンの種類は、LOGON32_PROVIDER_WINNT50 ログオン プロバイダーでのみサポートされます。

LOGON32_LOGON_SERVICE
サービスの種類のログオンを示します。 指定されたアカウントで、サービス特権が有効になっている必要があります。
LOGON32_LOGON_UNLOCK
このログオンの種類は、コンピューターを対話的に使用するユーザーにログオンする GINA DLL 用です。 このログオンの種類では、ワークステーションのロックが解除された日時を示す一意の監査レコードを生成できます。

[in] dwLogonProvider

ログオン プロバイダー。 このパラメーターには、次の値のいずれかを指定できます。

意味
LOGON32_PROVIDER_DEFAULT
システムの標準ログオン プロバイダーを使用します。 既定の セキュリティ プロバイダー は NTLM です。
LOGON32_PROVIDER_WINNT50
ネゴシエート ログオン プロバイダーを使用します。
LOGON32_PROVIDER_WINNT40
NTLM ログオン プロバイダーを使用します。

[out, optional] phToken

指定したユーザーを表すトークンへのハンドルを受け取るハンドル変数へのポインター。

返されたハンドルは、 ImpersonateLoggedOnUser 関数の呼び出しで使用できます。

ほとんどの場合、返されるハンドルは、CreateProcessAsUser 関数の呼び出しで使用できるプライマリ トークンです。 ただし、LOGON32_LOGON_NETWORK フラグを指定すると、LogonUserEx は、DuplicateTokenEx を呼び出して偽装トークンをプライマリ トークンに変換しない限り、CreateProcessAsUser で使用できない偽装トークンを返します。

このハンドルが不要になったら、 CloseHandle 関数を呼び出して閉じます。

[out, optional] ppLogonSid

ログオンしているユーザーの SID を受け取る セキュリティ識別子 (SID) へのポインターへのポインター。

SID の使用が完了したら、 LocalFree 関数を呼び出して SID を解放します。

[out, optional] ppProfileBuffer

ログオンしているユーザーのプロファイルを含むバッファーのアドレスを受け取るポインターへのポインター。

[out, optional] pdwProfileLength

プロファイル バッファーの長さを受け取る DWORD へのポインター。

[out, optional] pQuotaLimits

ログオンしている ユーザーのクォータ に関する情報を受け取るQUOTA_LIMITS構造体へのポインター。

戻り値

関数が成功した場合、関数は 0 以外の値を返します。

関数が失敗すると、0 が返されます。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

LOGON32_LOGON_NETWORKログオンの種類は最速ですが、次の制限があります。

  • この関数は、プライマリ トークンではなく、 偽装トークンを返します。 このトークンを CreateProcessAsUser 関数で直接使用することはできません。 ただし、 DuplicateTokenEx 関数を呼び出してトークンをプライマリ トークンに変換し、 CreateProcessAsUser でそれを使用できます。
  • トークンをプライマリ トークンに変換し、 それを CreateProcessAsUser で使用してプロセスを開始した場合、新しいプロセスはリダイレクターを介してリモート サーバーやプリンターなどの他のネットワーク リソースにアクセスできません。 例外として、ネットワーク リソースがアクセス制御されていない場合は、新しいプロセスからアクセスできるようになります。

Passport アカウントにログオンしている場合を除き、この機能にはSE_TCB_NAME特権は必要ありません。

lpszUsername で指定されたアカウントには、必要なアカウント権限が必要です。 たとえば、LOGON32_LOGON_INTERACTIVE フラグを持つユーザーにログオンするには、ユーザー (またはユーザーが属するグループ) にSE_INTERACTIVE_LOGON_NAME アカウント権限が必要です。 さまざまなログオン操作に影響するアカウント権限の一覧については、「 Account Object Access Rights」を参照してください。

少なくとも 1 つのトークンが存在する場合、ユーザーはログオンしていると見なされます。 CreateProcessAsUser を呼び出してトークンを閉じると、ユーザーはプロセス (およびすべての子プロセス) が終了するまでログオンし続けます。

LogonUserEx 呼び出しが成功した場合、システムは、プロバイダーの NPLogonNotify エントリ ポイント関数を呼び出すことによって、ログオンが発生したことをネットワーク プロバイダーに通知します。

注意

winbase.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして LogonUserEx を定義します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー winbase.h (Windows.h を含む)
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

クライアント/サーバー Access Control

クライアント/サーバー Access Control関数

CloseHandle

CreateProcessAsUser

DuplicateTokenEx

ImpersonateLoggedOnUser

QUOTA_LIMITS