ホーム › Security.Authentication.Identity › KERB_EXTERNAL_TICKET
KERB_EXTERNAL_TICKET
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ServiceName | KERB_EXTERNAL_NAME* | 8/4 | +0 | +0 | 複数の部分から成る正規化されたサービス名が返される KERB_EXTERNAL_NAME 構造体です。 | ||||||||||||||||||||||||||||||
| TargetName | KERB_EXTERNAL_NAME* | 8/4 | +8 | +4 | 複数の部分から成るサービスプリンシパル名 (SPN) を格納する KERB_EXTERNAL_NAME 構造体です。 | ||||||||||||||||||||||||||||||
| ClientName | KERB_EXTERNAL_NAME* | 8/4 | +16 | +8 | チケット内のクライアント名を格納する KERB_EXTERNAL_NAME 構造体です。この名前は、現在のドメインを基準とした相対的な名前です。 | ||||||||||||||||||||||||||||||
| DomainName | LSA_UNICODE_STRING | 16/8 | +24 | +12 | ServiceName メンバーに対応するドメインの名前を格納する UNICODE_STRING です。これは、チケットを発行したドメインです。 | ||||||||||||||||||||||||||||||
| TargetDomainName | LSA_UNICODE_STRING | 16/8 | +40 | +20 | チケットが有効なドメインの名前を格納する UNICODE_STRING です。ドメイン間チケットの場合、これは宛先のドメインです。 | ||||||||||||||||||||||||||||||
| AltTargetDomainName | LSA_UNICODE_STRING | 16/8 | +56 | +28 | 宛先ドメインの別名を格納する UNICODE_STRING です。すべてのドメインは、DNS 名と NetBIOS 名という 2 つの名前を持ちます。チケットで返された名前が、チケットの要求に使用した名前と異なる場合 (Kerberos のキー配布センター (KDC) が名前のマッピングを行うことがあります)、この文字列には元の名前が格納されます。 | ||||||||||||||||||||||||||||||
| SessionKey | KERB_CRYPTO_KEY | 16/12 | +72 | +36 | チケットのセッションキーを格納する KERB_CRYPTO_KEY 構造体です。 | ||||||||||||||||||||||||||||||
| TicketFlags | KERB_TICKET_FLAGS | 4 | +88 | +48 | インターネット RFC 4120 で定義されているチケットフラグです。このパラメーターには、次の値のうち 1 つ以上を指定できます。
| ||||||||||||||||||||||||||||||
| Flags | DWORD | 4 | +92 | +52 | 将来の使用のために予約されています。このメンバーには 0 を設定してください。 | ||||||||||||||||||||||||||||||
| KeyExpirationTime | LONGLONG | 8 | +96 | +56 | キーの有効期限が切れる時刻を格納する FILETIME 構造体です。 | ||||||||||||||||||||||||||||||
| StartTime | LONGLONG | 8 | +104 | +64 | チケットが有効になる時刻を格納する FILETIME 構造体です。 | ||||||||||||||||||||||||||||||
| EndTime | LONGLONG | 8 | +112 | +72 | チケットの有効期限が切れる時刻を格納する FILETIME 構造体です。 | ||||||||||||||||||||||||||||||
| RenewUntil | LONGLONG | 8 | +120 | +80 | チケットを更新できる最終時刻を格納する FILETIME 構造体です。この時刻より後に送信された更新要求は拒否されます。 | ||||||||||||||||||||||||||||||
| TimeSkew | LONGLONG | 8 | +128 | +88 | チケットを発行するコンピューターの現在時刻と、チケットが使用されるコンピューターの現在時刻との間で測定された時間差を格納する FILETIME 構造体です。 | ||||||||||||||||||||||||||||||
| EncodedTicketSize | DWORD | 4 | +136 | +96 | エンコードされたチケットのサイズ (バイト単位)。 | ||||||||||||||||||||||||||||||
| EncodedTicket | BYTE* | 8/4 | +144 | +100 | Abstract Syntax Notation One (ASN.1) でエンコードされたチケットを格納するバッファーです。 |
公式ドキュメント
KERB_EXTERNAL_TICKET 構造体は、外部チケットに関する情報を格納します。
外部チケットとは、外部のユーザーにエクスポートされた Kerberos チケットです。Kerberos チケットは、インターネット RFC 4120 で定義されています。詳細については、http://www.ietf.org を参照してください。この構造体は KERB_RETRIEVE_TKT_RESPONSE 構造体で使用されます。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// LSA_UNICODE_STRING (x64 16 / x86 8 バイト)
typedef struct LSA_UNICODE_STRING {
WORD Length;
WORD MaximumLength;
LPWSTR Buffer;
} LSA_UNICODE_STRING;
// KERB_CRYPTO_KEY (x64 16 / x86 12 バイト)
typedef struct KERB_CRYPTO_KEY {
KERB_CRYPTO_KEY_TYPE KeyType;
DWORD Length;
BYTE* Value;
} KERB_CRYPTO_KEY;
// KERB_EXTERNAL_TICKET (x64 152 / x86 104 バイト)
typedef struct KERB_EXTERNAL_TICKET {
KERB_EXTERNAL_NAME* ServiceName;
KERB_EXTERNAL_NAME* TargetName;
KERB_EXTERNAL_NAME* ClientName;
LSA_UNICODE_STRING DomainName;
LSA_UNICODE_STRING TargetDomainName;
LSA_UNICODE_STRING AltTargetDomainName;
KERB_CRYPTO_KEY SessionKey;
KERB_TICKET_FLAGS TicketFlags;
DWORD Flags;
LONGLONG KeyExpirationTime;
LONGLONG StartTime;
LONGLONG EndTime;
LONGLONG RenewUntil;
LONGLONG TimeSkew;
DWORD EncodedTicketSize;
BYTE* EncodedTicket;
} KERB_EXTERNAL_TICKET;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LSA_UNICODE_STRING
{
public ushort Length;
public ushort MaximumLength;
public IntPtr Buffer;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KERB_CRYPTO_KEY
{
public int KeyType;
public uint Length;
public IntPtr Value;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KERB_EXTERNAL_TICKET
{
public IntPtr ServiceName;
public IntPtr TargetName;
public IntPtr ClientName;
public LSA_UNICODE_STRING DomainName;
public LSA_UNICODE_STRING TargetDomainName;
public LSA_UNICODE_STRING AltTargetDomainName;
public KERB_CRYPTO_KEY SessionKey;
public uint TicketFlags;
public uint Flags;
public long KeyExpirationTime;
public long StartTime;
public long EndTime;
public long RenewUntil;
public long TimeSkew;
public uint EncodedTicketSize;
public IntPtr EncodedTicket;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LSA_UNICODE_STRING
Public Length As UShort
Public MaximumLength As UShort
Public Buffer As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KERB_CRYPTO_KEY
Public KeyType As Integer
Public Length As UInteger
Public Value As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KERB_EXTERNAL_TICKET
Public ServiceName As IntPtr
Public TargetName As IntPtr
Public ClientName As IntPtr
Public DomainName As LSA_UNICODE_STRING
Public TargetDomainName As LSA_UNICODE_STRING
Public AltTargetDomainName As LSA_UNICODE_STRING
Public SessionKey As KERB_CRYPTO_KEY
Public TicketFlags As UInteger
Public Flags As UInteger
Public KeyExpirationTime As Long
Public StartTime As Long
Public EndTime As Long
Public RenewUntil As Long
Public TimeSkew As Long
Public EncodedTicketSize As UInteger
Public EncodedTicket As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class LSA_UNICODE_STRING(ctypes.Structure):
_fields_ = [
("Length", ctypes.c_ushort),
("MaximumLength", ctypes.c_ushort),
("Buffer", ctypes.c_void_p),
]
class KERB_CRYPTO_KEY(ctypes.Structure):
_fields_ = [
("KeyType", ctypes.c_int),
("Length", wintypes.DWORD),
("Value", ctypes.c_void_p),
]
class KERB_EXTERNAL_TICKET(ctypes.Structure):
_fields_ = [
("ServiceName", ctypes.c_void_p),
("TargetName", ctypes.c_void_p),
("ClientName", ctypes.c_void_p),
("DomainName", LSA_UNICODE_STRING),
("TargetDomainName", LSA_UNICODE_STRING),
("AltTargetDomainName", LSA_UNICODE_STRING),
("SessionKey", KERB_CRYPTO_KEY),
("TicketFlags", wintypes.DWORD),
("Flags", wintypes.DWORD),
("KeyExpirationTime", ctypes.c_longlong),
("StartTime", ctypes.c_longlong),
("EndTime", ctypes.c_longlong),
("RenewUntil", ctypes.c_longlong),
("TimeSkew", ctypes.c_longlong),
("EncodedTicketSize", wintypes.DWORD),
("EncodedTicket", ctypes.c_void_p),
]#[repr(C)]
pub struct LSA_UNICODE_STRING {
pub Length: u16,
pub MaximumLength: u16,
pub Buffer: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct KERB_CRYPTO_KEY {
pub KeyType: i32,
pub Length: u32,
pub Value: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct KERB_EXTERNAL_TICKET {
pub ServiceName: *mut core::ffi::c_void,
pub TargetName: *mut core::ffi::c_void,
pub ClientName: *mut core::ffi::c_void,
pub DomainName: LSA_UNICODE_STRING,
pub TargetDomainName: LSA_UNICODE_STRING,
pub AltTargetDomainName: LSA_UNICODE_STRING,
pub SessionKey: KERB_CRYPTO_KEY,
pub TicketFlags: u32,
pub Flags: u32,
pub KeyExpirationTime: i64,
pub StartTime: i64,
pub EndTime: i64,
pub RenewUntil: i64,
pub TimeSkew: i64,
pub EncodedTicketSize: u32,
pub EncodedTicket: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type LSA_UNICODE_STRING struct {
Length uint16
MaximumLength uint16
Buffer uintptr
}
type KERB_CRYPTO_KEY struct {
KeyType int32
Length uint32
Value uintptr
}
type KERB_EXTERNAL_TICKET struct {
ServiceName uintptr
TargetName uintptr
ClientName uintptr
DomainName LSA_UNICODE_STRING
TargetDomainName LSA_UNICODE_STRING
AltTargetDomainName LSA_UNICODE_STRING
SessionKey KERB_CRYPTO_KEY
TicketFlags uint32
Flags uint32
KeyExpirationTime int64
StartTime int64
EndTime int64
RenewUntil int64
TimeSkew int64
EncodedTicketSize uint32
EncodedTicket uintptr
}type
LSA_UNICODE_STRING = record
Length: Word;
MaximumLength: Word;
Buffer: Pointer;
end;
KERB_CRYPTO_KEY = record
KeyType: Integer;
Length: DWORD;
Value: Pointer;
end;
KERB_EXTERNAL_TICKET = record
ServiceName: Pointer;
TargetName: Pointer;
ClientName: Pointer;
DomainName: LSA_UNICODE_STRING;
TargetDomainName: LSA_UNICODE_STRING;
AltTargetDomainName: LSA_UNICODE_STRING;
SessionKey: KERB_CRYPTO_KEY;
TicketFlags: DWORD;
Flags: DWORD;
KeyExpirationTime: Int64;
StartTime: Int64;
EndTime: Int64;
RenewUntil: Int64;
TimeSkew: Int64;
EncodedTicketSize: DWORD;
EncodedTicket: Pointer;
end;const LSA_UNICODE_STRING = extern struct {
Length: u16,
MaximumLength: u16,
Buffer: ?*anyopaque,
};
const KERB_CRYPTO_KEY = extern struct {
KeyType: i32,
Length: u32,
Value: ?*anyopaque,
};
const KERB_EXTERNAL_TICKET = extern struct {
ServiceName: ?*anyopaque,
TargetName: ?*anyopaque,
ClientName: ?*anyopaque,
DomainName: LSA_UNICODE_STRING,
TargetDomainName: LSA_UNICODE_STRING,
AltTargetDomainName: LSA_UNICODE_STRING,
SessionKey: KERB_CRYPTO_KEY,
TicketFlags: u32,
Flags: u32,
KeyExpirationTime: i64,
StartTime: i64,
EndTime: i64,
RenewUntil: i64,
TimeSkew: i64,
EncodedTicketSize: u32,
EncodedTicket: ?*anyopaque,
};type
LSA_UNICODE_STRING {.bycopy.} = object
Length: uint16
MaximumLength: uint16
Buffer: pointer
KERB_CRYPTO_KEY {.bycopy.} = object
KeyType: int32
Length: uint32
Value: pointer
KERB_EXTERNAL_TICKET {.bycopy.} = object
ServiceName: pointer
TargetName: pointer
ClientName: pointer
DomainName: LSA_UNICODE_STRING
TargetDomainName: LSA_UNICODE_STRING
AltTargetDomainName: LSA_UNICODE_STRING
SessionKey: KERB_CRYPTO_KEY
TicketFlags: uint32
Flags: uint32
KeyExpirationTime: int64
StartTime: int64
EndTime: int64
RenewUntil: int64
TimeSkew: int64
EncodedTicketSize: uint32
EncodedTicket: pointerstruct LSA_UNICODE_STRING
{
ushort Length;
ushort MaximumLength;
void* Buffer;
}
struct KERB_CRYPTO_KEY
{
int KeyType;
uint Length;
void* Value;
}
struct KERB_EXTERNAL_TICKET
{
void* ServiceName;
void* TargetName;
void* ClientName;
LSA_UNICODE_STRING DomainName;
LSA_UNICODE_STRING TargetDomainName;
LSA_UNICODE_STRING AltTargetDomainName;
KERB_CRYPTO_KEY SessionKey;
uint TicketFlags;
uint Flags;
long KeyExpirationTime;
long StartTime;
long EndTime;
long RenewUntil;
long TimeSkew;
uint EncodedTicketSize;
void* EncodedTicket;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; KERB_EXTERNAL_TICKET サイズ: 104 バイト(x86)
dim st, 26 ; 4byte整数×26(構造体サイズ 104 / 4 切り上げ)
; ServiceName : KERB_EXTERNAL_NAME* (+0, 4byte) varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; TargetName : KERB_EXTERNAL_NAME* (+4, 4byte) varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; ClientName : KERB_EXTERNAL_NAME* (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+12, 8byte) varptr(st)+12 を基点に操作(8byte:入れ子/配列)
; TargetDomainName : LSA_UNICODE_STRING (+20, 8byte) varptr(st)+20 を基点に操作(8byte:入れ子/配列)
; AltTargetDomainName : LSA_UNICODE_STRING (+28, 8byte) varptr(st)+28 を基点に操作(8byte:入れ子/配列)
; SessionKey : KERB_CRYPTO_KEY (+36, 12byte) varptr(st)+36 を基点に操作(12byte:入れ子/配列)
; TicketFlags : KERB_TICKET_FLAGS (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; Flags : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; KeyExpirationTime : LONGLONG (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; StartTime : LONGLONG (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; EndTime : LONGLONG (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; RenewUntil : LONGLONG (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; TimeSkew : LONGLONG (+88, 8byte) qpoke st,88,値 / qpeek(st,88) ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; EncodedTicketSize : DWORD (+96, 4byte) st.24 = 値 / 値 = st.24 (lpoke/lpeek も可)
; EncodedTicket : BYTE* (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; KERB_EXTERNAL_TICKET サイズ: 152 バイト(x64)
dim st, 38 ; 4byte整数×38(構造体サイズ 152 / 4 切り上げ)
; ServiceName : KERB_EXTERNAL_NAME* (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; TargetName : KERB_EXTERNAL_NAME* (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; ClientName : KERB_EXTERNAL_NAME* (+16, 8byte) varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+24, 16byte) varptr(st)+24 を基点に操作(16byte:入れ子/配列)
; TargetDomainName : LSA_UNICODE_STRING (+40, 16byte) varptr(st)+40 を基点に操作(16byte:入れ子/配列)
; AltTargetDomainName : LSA_UNICODE_STRING (+56, 16byte) varptr(st)+56 を基点に操作(16byte:入れ子/配列)
; SessionKey : KERB_CRYPTO_KEY (+72, 16byte) varptr(st)+72 を基点に操作(16byte:入れ子/配列)
; TicketFlags : KERB_TICKET_FLAGS (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; Flags : DWORD (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; KeyExpirationTime : LONGLONG (+96, 8byte) qpoke st,96,値 / qpeek(st,96) ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; StartTime : LONGLONG (+104, 8byte) qpoke st,104,値 / qpeek(st,104) ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; EndTime : LONGLONG (+112, 8byte) qpoke st,112,値 / qpeek(st,112) ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; RenewUntil : LONGLONG (+120, 8byte) qpoke st,120,値 / qpeek(st,120) ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; TimeSkew : LONGLONG (+128, 8byte) qpoke st,128,値 / qpeek(st,128) ※IronHSPのみ。3.7/3.8は lpoke st,128,下位 : lpoke st,132,上位
; EncodedTicketSize : DWORD (+136, 4byte) st.34 = 値 / 値 = st.34 (lpoke/lpeek も可)
; EncodedTicket : BYTE* (+144, 8byte) qpoke st,144,値 / qpeek(st,144) ※IronHSPのみ。3.7/3.8は lpoke st,144,下位 : lpoke st,148,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global LSA_UNICODE_STRING
#field short Length
#field short MaximumLength
#field intptr Buffer
#endstruct
#defstruct global KERB_CRYPTO_KEY
#field int KeyType
#field int Length
#field intptr Value
#endstruct
#defstruct global KERB_EXTERNAL_TICKET
#field intptr ServiceName
#field intptr TargetName
#field intptr ClientName
#field LSA_UNICODE_STRING DomainName
#field LSA_UNICODE_STRING TargetDomainName
#field LSA_UNICODE_STRING AltTargetDomainName
#field KERB_CRYPTO_KEY SessionKey
#field int TicketFlags
#field int Flags
#field int64 KeyExpirationTime
#field int64 StartTime
#field int64 EndTime
#field int64 RenewUntil
#field int64 TimeSkew
#field int EncodedTicketSize
#field intptr EncodedTicket
#endstruct
stdim st, KERB_EXTERNAL_TICKET ; NSTRUCT 変数を確保
st->TicketFlags = 100
mes "TicketFlags=" + st->TicketFlags