SEC_WINNT_AUTH_IDENTITY_EX2
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | 構造体のバージョン番号です。SEC_WINNT_AUTH_IDENTITY_VERSION_2 でなければなりません。 | ||||||||||||||||||||
| cbHeaderLength | WORD | 2 | +4 | +4 | 構造体ヘッダーのサイズ(バイト単位)です。 | ||||||||||||||||||||
| cbStructureLength | DWORD | 4 | +8 | +8 | 構造体のサイズ(バイト単位)です。 | ||||||||||||||||||||
| UserOffset | DWORD | 4 | +12 | +12 | 構造体の先頭からユーザー名文字列の先頭までのオフセットです。 | ||||||||||||||||||||
| UserLength | WORD | 2 | +16 | +16 | ユーザー名文字列のサイズ(バイト単位)です。 | ||||||||||||||||||||
| DomainOffset | DWORD | 4 | +20 | +20 | 構造体の先頭からドメイン名文字列の先頭までのオフセットです。 ID 資格情報には、ドメイン名ではなく ID プロバイダー名を格納してください。 | ||||||||||||||||||||
| DomainLength | WORD | 2 | +24 | +24 | ドメイン名文字列のサイズ(バイト単位)です。 | ||||||||||||||||||||
| PackedCredentialsOffset | DWORD | 4 | +28 | +28 | 構造体の先頭から、パックされた資格情報の先頭までのオフセットです。 パックされた資格情報は SEC_WINNT_AUTH_PACKED_CREDENTIALS 構造体であり、資格情報の種類を一意に指定する資格情報タイプを格納します。 | ||||||||||||||||||||
| PackedCredentialsLength | WORD | 2 | +32 | +32 | パックされた資格情報文字列のサイズ(バイト単位)です。 | ||||||||||||||||||||
| Flags | DWORD | 4 | +36 | +36 | ネゴシエート可能なセキュリティパッケージが使用する種類を示す unsigned long 型のフラグです。
| ||||||||||||||||||||
| PackageListOffset | DWORD | 4 | +40 | +40 | 構造体の先頭から、サポートされるパッケージの一覧の先頭までのオフセットです。 | ||||||||||||||||||||
| PackageListLength | WORD | 2 | +44 | +44 | サポートされるパッケージ一覧のサイズ(バイト単位)です。 |
公式ドキュメント
認証 ID に関する情報を格納します。SEC_WINNT_AUTH_IDENTITY_EX2 構造体は、AcquireCredentialsHandle 関数に渡される認証データを格納します。
解説(Remarks)
この認証 ID バッファーは、いくつかの資格情報 API から返される場合があります。たとえば、GetSerialization メソッドや、CredUIPromptForWindowsCredential 関数、SspiPromptForCredentials 関数などです。
この構造体は認証 ID バッファーのヘッダーを表し、データは構造体の末尾に続けて格納されます。バッファーのサイズは cbStructureLength メンバーで指定されますが、実際のバッファーサイズは cbStructureLength より大きいことも小さいこともあります。SspiValidateAuthIdentity などの一部の関数は、ID 構造体へのポインターのみを入力として受け取り、バッファーサイズは受け取りません。そのため、これらの関数はバッファー内部のデータを検証できますが、バッファーサイズを検証することはできません。その結果、バッファーの範囲外のデータを読み書きしてしまう可能性があります。信頼できない ID バッファーを扱う際にバッファーオーバーランを回避するには、アプリケーションで SspiUnmarshalAuthIdentity を呼び出して、サイズが検証された ID 構造体へのポインターを取得し、そのポインターを各関数に渡してください。
SEC_WINNT_AUTH_IDENTITY_EX2 構造体は QueryContextAttributes(CredSSP) から返され、AcquireCredentialsHandle(CredSSP)、LsaLogonUser、およびその他の ID プロバイダーインターフェイスで使用されます。
SEC_WINNT_AUTH_PACKED_CREDENTIALS には、SEC_WINNT_AUTH_DATA_TYPE_PASSWORD として定義されるパスワード資格情報タイプを格納できます。この資格情報タイプは、ドメインユーザーのパスワード資格情報のほか、その他のオンライン ID も表します。この資格情報タイプや SEC_WINNT_AUTH_PACKED_CREDENTIALS 構造体のその他の定義を参照するコードをコンパイルするには、アプリケーションで _SEC_WINNT_AUTH_TYPES を定義する必要があります。
アプリケーションは Flags メンバーを直接照会したり設定したりしないでください。SEC_WINNT_AUTH_IDENTITY_EX2 構造体の暗号化と復号を管理するには、SspiIsAuthIdentityEncrypted、SspiEncryptAuthIdentityEx、SspiDecryptAuthIdentityEx の各関数を使用してください。
ID プロバイダーは、自身のパスワード資格情報をドメインパスワードや他の ID プロバイダーのパスワードと区別するために、SEC_WINNT_AUTH_IDENTITY_FLAGS_ID_PROVIDER とドメイン名フィールドを明示的に確認または設定する必要があります。
CredPackAuthenticationBuffer 関数を CRED_PACK_ID_PROVIDER_CREDENTIALS オプションを指定して呼び出すと、SEC_WINNT_AUTH_DATA_TYPE_PASSWORD 資格情報タイプの認証データ、SEC_WINNT_AUTH_IDENTITY_FLAGS_ID_PROVIDER 値を含む Flags メンバー、およびプロバイダー名に設定された DomainOffset メンバーを持つ SEC_WINNT_AUTH_IDENTITY_EX2 構造体を作成できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SEC_WINNT_AUTH_IDENTITY_EX2 (x64 48 / x86 48 バイト)
typedef struct SEC_WINNT_AUTH_IDENTITY_EX2 {
DWORD Version;
WORD cbHeaderLength;
DWORD cbStructureLength;
DWORD UserOffset;
WORD UserLength;
DWORD DomainOffset;
WORD DomainLength;
DWORD PackedCredentialsOffset;
WORD PackedCredentialsLength;
DWORD Flags;
DWORD PackageListOffset;
WORD PackageListLength;
} SEC_WINNT_AUTH_IDENTITY_EX2;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SEC_WINNT_AUTH_IDENTITY_EX2
{
public uint Version;
public ushort cbHeaderLength;
public uint cbStructureLength;
public uint UserOffset;
public ushort UserLength;
public uint DomainOffset;
public ushort DomainLength;
public uint PackedCredentialsOffset;
public ushort PackedCredentialsLength;
public uint Flags;
public uint PackageListOffset;
public ushort PackageListLength;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SEC_WINNT_AUTH_IDENTITY_EX2
Public Version As UInteger
Public cbHeaderLength As UShort
Public cbStructureLength As UInteger
Public UserOffset As UInteger
Public UserLength As UShort
Public DomainOffset As UInteger
Public DomainLength As UShort
Public PackedCredentialsOffset As UInteger
Public PackedCredentialsLength As UShort
Public Flags As UInteger
Public PackageListOffset As UInteger
Public PackageListLength As UShort
End Structureimport ctypes
from ctypes import wintypes
class SEC_WINNT_AUTH_IDENTITY_EX2(ctypes.Structure):
_fields_ = [
("Version", wintypes.DWORD),
("cbHeaderLength", ctypes.c_ushort),
("cbStructureLength", wintypes.DWORD),
("UserOffset", wintypes.DWORD),
("UserLength", ctypes.c_ushort),
("DomainOffset", wintypes.DWORD),
("DomainLength", ctypes.c_ushort),
("PackedCredentialsOffset", wintypes.DWORD),
("PackedCredentialsLength", ctypes.c_ushort),
("Flags", wintypes.DWORD),
("PackageListOffset", wintypes.DWORD),
("PackageListLength", ctypes.c_ushort),
]#[repr(C)]
pub struct SEC_WINNT_AUTH_IDENTITY_EX2 {
pub Version: u32,
pub cbHeaderLength: u16,
pub cbStructureLength: u32,
pub UserOffset: u32,
pub UserLength: u16,
pub DomainOffset: u32,
pub DomainLength: u16,
pub PackedCredentialsOffset: u32,
pub PackedCredentialsLength: u16,
pub Flags: u32,
pub PackageListOffset: u32,
pub PackageListLength: u16,
}import "golang.org/x/sys/windows"
type SEC_WINNT_AUTH_IDENTITY_EX2 struct {
Version uint32
cbHeaderLength uint16
cbStructureLength uint32
UserOffset uint32
UserLength uint16
DomainOffset uint32
DomainLength uint16
PackedCredentialsOffset uint32
PackedCredentialsLength uint16
Flags uint32
PackageListOffset uint32
PackageListLength uint16
}type
SEC_WINNT_AUTH_IDENTITY_EX2 = record
Version: DWORD;
cbHeaderLength: Word;
cbStructureLength: DWORD;
UserOffset: DWORD;
UserLength: Word;
DomainOffset: DWORD;
DomainLength: Word;
PackedCredentialsOffset: DWORD;
PackedCredentialsLength: Word;
Flags: DWORD;
PackageListOffset: DWORD;
PackageListLength: Word;
end;const SEC_WINNT_AUTH_IDENTITY_EX2 = extern struct {
Version: u32,
cbHeaderLength: u16,
cbStructureLength: u32,
UserOffset: u32,
UserLength: u16,
DomainOffset: u32,
DomainLength: u16,
PackedCredentialsOffset: u32,
PackedCredentialsLength: u16,
Flags: u32,
PackageListOffset: u32,
PackageListLength: u16,
};type
SEC_WINNT_AUTH_IDENTITY_EX2 {.bycopy.} = object
Version: uint32
cbHeaderLength: uint16
cbStructureLength: uint32
UserOffset: uint32
UserLength: uint16
DomainOffset: uint32
DomainLength: uint16
PackedCredentialsOffset: uint32
PackedCredentialsLength: uint16
Flags: uint32
PackageListOffset: uint32
PackageListLength: uint16struct SEC_WINNT_AUTH_IDENTITY_EX2
{
uint Version;
ushort cbHeaderLength;
uint cbStructureLength;
uint UserOffset;
ushort UserLength;
uint DomainOffset;
ushort DomainLength;
uint PackedCredentialsOffset;
ushort PackedCredentialsLength;
uint Flags;
uint PackageListOffset;
ushort PackageListLength;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SEC_WINNT_AUTH_IDENTITY_EX2 サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; cbHeaderLength : WORD (+4, 2byte) wpoke st,4,値 / 値 = wpeek(st,4)
; cbStructureLength : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; UserOffset : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; UserLength : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; DomainOffset : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; DomainLength : WORD (+24, 2byte) wpoke st,24,値 / 値 = wpeek(st,24)
; PackedCredentialsOffset : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; PackedCredentialsLength : WORD (+32, 2byte) wpoke st,32,値 / 値 = wpeek(st,32)
; Flags : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; PackageListOffset : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; PackageListLength : WORD (+44, 2byte) wpoke st,44,値 / 値 = wpeek(st,44)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SEC_WINNT_AUTH_IDENTITY_EX2
#field int Version
#field short cbHeaderLength
#field int cbStructureLength
#field int UserOffset
#field short UserLength
#field int DomainOffset
#field short DomainLength
#field int PackedCredentialsOffset
#field short PackedCredentialsLength
#field int Flags
#field int PackageListOffset
#field short PackageListLength
#endstruct
stdim st, SEC_WINNT_AUTH_IDENTITY_EX2 ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version