NtDuplicateToken 関数は、既存のトークンを複製する新しい アクセス トークン へのハンドルを作成します。 この関数は、プライマリ トークンまたは偽装トークンを作成できます。
構文
__kernel_entry NTSYSCALLAPI NTSTATUS NtDuplicateToken(
[in] HANDLE ExistingTokenHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[in] BOOLEAN EffectiveOnly,
[in] TOKEN_TYPE TokenType,
[out] PHANDLE NewTokenHandle
);
パラメーター
[in] ExistingTokenHandle
TOKEN_DUPLICATEアクセス権で開かれた既存のアクセス トークンへのハンドル。 このパラメーターは必須であり、NULL にすることはできません。
[in] DesiredAccess
新しいトークンに対して要求されたアクセス権を指定するビットマスク。 NtDuplicateToken は、要求されたアクセス権を既存のトークンの随意アクセス制御リスト (DACL) と比較して、新しいトークンに対して許可または拒否される権限を決定します。 既存のトークンと同じアクセス権を要求するには、ゼロを指定します。 呼び出し元に対して有効なすべてのアクセス権を要求するには、MAXIMUM_ALLOWEDを指定します。 このパラメーターは省略可能であり、0、MAXIMUM_ALLOWED、または次の 1 つ以上の値のビットごとの OR の組み合わせにすることができます。
価値 | 意味 |
---|---|
削除 | オブジェクトを削除するために必要です。 |
READ_CONTROL | オブジェクトの DACL と所有権の情報を読み取るために必要です。 システム アクセス制御リスト (SACL) へのアクセスについては、この表で後述するACCESS_SYSTEM_SECURITYを参照してください。 |
WRITE_DAC | オブジェクトの DACL 情報を変更するために必要です。 |
WRITE_OWNER | オブジェクトのセキュリティ記述子 (SECURITY_DESCRIPTOR) の所有権情報を変更するために必要です。 |
ACCESS_SYSTEM_SECURITY | オブジェクトの ACL で SACL を取得または設定するために必要です。 オペレーティング システムは、呼び出し元のスレッドのアクセス トークンでSE_SECURITY_NAME特権が有効になっている場合にのみ、この権限を新しいトークンに付与します。 |
STANDARD_RIGHTS_READ | 現在、同じREAD_CONTROLに定義されています。 |
STANDARD_RIGHTS_WRITE | 現在、同じREAD_CONTROLに定義されています。 |
STANDARD_RIGHTS_EXECUTE | 現在、同じREAD_CONTROLに定義されています。 |
STANDARD_RIGHTS_REQUIRED | DELETE、READ_CONTROL、WRITE_DAC、およびWRITE_OWNERアクセスを結合します。 |
STANDARD_RIGHTS_ALL | DELETE、READ_CONTROL、WRITE_DAC、WRITE_OWNER、SYNCHRONIZE アクセスを組み合わせます。 ただし、SYNCHRONIZE 値はトークン オブジェクトには適用できません。 したがって、STANDARD_RIGHTS_ALLには、STANDARD_RIGHTS_REQUIREDと機能的に同等の機能があります。 |
TOKEN_ADJUST_DEFAULT | アクセス トークンの既定の所有者、プライマリ グループ、または DACL を変更するために必要です。 |
TOKEN_ADJUST_GROUPS | アクセス トークン内のグループの属性を調整するために必要です。 |
TOKEN_ADJUST_PRIVILEGES | アクセス トークンの特権を有効または無効にするために必要です。 |
TOKEN_ADJUST_SESSIONID | アクセス トークンのセッション ID (SID) を調整するために必要です。 オペレーティング システムは、呼び出し元スレッドのアクセス トークンでSE_TCB_NAME特権が有効になっている場合にのみ、この権限を新しいトークンに付与します。 |
TOKEN_ASSIGN_PRIMARY | プロセスにプライマリ トークンをアタッチするために必要です。 オペレーティング システムは、呼び出し元スレッドのアクセス トークンでSE_ASSIGNPRIMARYTOKEN_NAME特権が有効になっている場合にのみ、この権限を新しいトークンに付与します。 |
TOKEN_DUPLICATE | アクセス トークンを複製するために必要です。 このルーチンを正常に使用するには、指定された ExistingTokenHandle トークンにこの権限が含まれている必要があることに注意してください。 |
TOKEN_EXECUTE | STANDARD_RIGHTS_EXECUTEとTOKEN_IMPERSONATEを結合します。 |
TOKEN_IMPERSONATE | 偽装アクセス トークンをプロセスにアタッチするために必要です。 |
TOKEN_QUERY | アクセス トークンのクエリを実行するために必要です。 |
TOKEN_QUERY_SOURCE | アクセス トークンのソースのクエリを実行するために必要です。 |
TOKEN_READ | STANDARD_RIGHTS_READとTOKEN_QUERYを結合します。 |
TOKEN_WRITE | STANDARD_RIGHTS_WRITE、TOKEN_ADJUST_PRIVILEGES、TOKEN_ADJUST_GROUPS、およびTOKEN_ADJUST_DEFAULTを結合します。 |
TOKEN_ALL_ACCESS | トークンに対して可能なすべてのトークン アクセス許可を組み合わせます。 |
詳細については、「Access-Token オブジェクト のアクセス権をする」を参照してください。 アクセス トークンは SYNCHRONIZE 権限をサポートしないことに注意してください。
[in] ObjectAttributes
新しいトークンに対して要求されたプロパティを記述する OBJECT_ATTRIBUTES 構造体へのポインター。 ObjectAttributes パラメーターは省略可能であり、NULL にすることができます。 ObjectAttributes パラメーターが NULL の場合、または ObjectAttributes パラメーターが指す構造体の SecurityDescriptor メンバーが NULL の場合、新しいトークンは既定のセキュリティ記述子を受け取り、新しいトークン ハンドルを継承できません。 その場合、この既定のセキュリティ記述子は、呼び出し元のトークンに格納されているユーザー グループ、プライマリ グループ、および DACL 情報から作成されます。
TokenType パラメーターが TokenImpersonation に設定されている場合:
- ObjectAttributes パラメーターを使用して、新しいトークンの偽装レベルを指定できます。 これは、ObjectAttributes->SecurityQualityOfService.ImpersonationLevel を適切な SECURITY_IMPERSONATION_LEVEL 列挙値に設定することで実現できます。 詳細については、SECURITY_QUALITY_OF_SERVICEを参照してください。
- 既存のトークンが偽装トークンであり、ObjectAttributes パラメーターが偽装情報を提供しない場合、新しいトークンの偽装レベルは既存のトークンの偽装レベルに設定されます。
- 既存のトークンがプライマリ トークンであり、偽装レベルの情報が提供されていない場合、新しい偽装トークンには SECURITY_IMPERSONATION_LEVEL 偽装レベルが設定されます。
[in] EffectiveOnly
既存のトークン全体を新しいトークンに複製するか、トークンの有効な (現在有効な) 部分だけに複製するかを示すブール値。 TRUE 設定すると、ソース トークンの現在有効な部分のみが複製されます。 FALSE 設定すると、既存のトークン全体が複製されます。 これにより、保護されたサブシステムの呼び出し元が、保護されたサブシステムで使用できるオプションのグループと特権を制限する手段が提供されます。 たとえば、EffectiveOnly が TRUE 場合、呼び出し元はトークンを複製できますが、Administrators グループと SeTcbPrivilege 権限を削除できます。 その後、結果のトークンを子プロセス (CreateProcessAsUser) に渡すことができます。これにより、子プロセスで実行できる処理が制限されます。 このパラメーターは必須です。
[in] TokenType
TOKEN_TYPE 列挙体から次のいずれかの値を指定します。
価値 | 意味 |
---|---|
TokenPrimary | 新しいトークンはプライマリ トークンです。 既存のトークンが偽装トークンの場合、既存の偽装トークンには、SecurityImpersonation または SecurityDelegationの偽装レベル (ObjectAttributes パラメーターによって提供される) が必要です。 それ以外の場合 NtDuplicateToken は、STATUS_BAD_IMPERSONATION_LEVELが返されます。 |
TokenImpersonation | 新しいトークンは偽装トークンです。 既存のトークンが偽装トークンの場合、新しいトークンの要求された偽装レベル (ObjectAttributes パラメーターによって提供される) は、既存のトークンの偽装レベルを超えてはなりません。 それ以外の場合、NtDuplicateToken はSTATUS_BAD_IMPERSONATION_LEVELを返します。 |
TokenType パラメーターは必須であり、NULL にすることはできません。
[out] NewTokenHandle
新しいトークンへのハンドルを受け取る、呼び出し元によって割り当てられた変数 (HANDLE 型) へのポインター。 このパラメーターは必須であり、NULL にすることはできません。
戻り値
NtDuplicateToken は、呼び出しが成功した場合にSTATUS_SUCCESSを返します。 考えられるエラー リターン コードは次のとおりです。
リターン コード | 形容 |
---|---|
STATUS_ACCESS_VIOLATION | メモリ アクセス違反が発生しました。 たとえば、前のモードがユーザー モードで、無効なユーザー モード メモリが指定されている場合、ntDuplicateToken はSTATUS_ACCESS_VIOLATIONを返します。 |
STATUS_INSUFFICIENT_RESOURCES | 新しいトークンを複製するために十分なメモリを割り当てませんでした。 |
STATUS_INVALID_PARAMETER | 無効なパラメーターが検出されました。 |
STATUS_BAD_IMPERSONATION_LEVEL | 新しいトークンに対して要求された偽装レベルが、既存のトークンの偽装レベルより大きい。 |
STATUS_ACCESS_DENIED | NtDuplicateToken ExistingTokenHandle アクセスできませんでした。 これは、既存のトークンにTOKEN_DUPLICATEアクセス権がない場合に発生します。 |
STATUS_INVALID_HANDLE | ExistingTokenHandle が無効なハンドルを参照。 |
備考
ObjectAttributes パラメーターによって偽装レベルの情報が提供されなかった場合、既存のトークンの偽装レベルが新しいトークンに使用されます。
省略可能な ObjectAttributes パラメーターによって指される構造体に関して、SecurityQualityOfService メンバーの OBJECT_ATTRIBUTES は、SECURITY_QUALITY_OF_SERVICE型の構造体を指します。 この構造体のメンバーについては、SECURITY_QUALITY_OF_SERVICE を参照してください。
InitializeObjectAttributes マクロを呼び出 後、SecurityQualityOfService メンバー 設定する必要があります。これは、現在、InitializeObjectAttributes SecurityQualityOfService NULL に設定されているためです。
NtDuplicateTokenのユーザー モード アナログについては、Windows SDK ドキュメントの「DuplicateTokenEx参照してください。
新しいトークンの使用が完了したら、NtClose 関数を呼び出してトークン ハンドルを閉じます。
NtDuplicateToken 関数の呼び出しがユーザー モードで発生する場合は、"ntDuplicateToken" ではなく"NtDuplicateToken" という名前使用する必要があります。
カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なる場合があります。 ルーチンの NtXxx と ZwXxx バージョンの間の関係の詳細については、「ネイティブ システム サービス ルーチンの Nt および Zw バージョンの使用 を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | ntifs.h (Ntifs.h、FltKernel.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 を する | HwStorPortProhibitedDIs、PowerIrpDDis |
関連項目
InitializeObjectAttributesの