Win32 API 日本語リファレンス
ホームSecurity.Authentication.Identity › KERB_EXTERNAL_TICKET

KERB_EXTERNAL_TICKET

構造体
サイズx64: 152 バイト / x86: 104 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
ServiceNameKERB_EXTERNAL_NAME*8/4+0+0チケットのサービス名(KERB_EXTERNAL_NAME)。
TargetNameKERB_EXTERNAL_NAME*8/4+8+4チケットのターゲット名(KERB_EXTERNAL_NAME)。NULL可。
ClientNameKERB_EXTERNAL_NAME*8/4+16+8チケットのクライアント名(KERB_EXTERNAL_NAME)。
DomainNameLSA_UNICODE_STRING16/8+24+12サービスのドメイン名(LSA_UNICODE_STRING)。
TargetDomainNameLSA_UNICODE_STRING16/8+40+20ターゲットのドメイン名(LSA_UNICODE_STRING)。
AltTargetDomainNameLSA_UNICODE_STRING16/8+56+28代替ターゲットドメイン名(LSA_UNICODE_STRING)。
SessionKeyKERB_CRYPTO_KEY16/12+72+36チケットのセッションキー(KERB_CRYPTO_KEY)。
TicketFlagsKERB_TICKET_FLAGS4+88+48チケットのフラグ(転送可能/更新可能等)。
FlagsDWORD4+92+52外部チケットに関する追加フラグ。
KeyExpirationTimeLONGLONG8+96+56セッションキーの有効期限(100ナノ秒単位)。
StartTimeLONGLONG8+104+64チケットの有効開始日時(100ナノ秒単位)。
EndTimeLONGLONG8+112+72チケットの有効終了日時(100ナノ秒単位)。
RenewUntilLONGLONG8+120+80チケットの更新可能期限(100ナノ秒単位)。
TimeSkewLONGLONG8+128+88クライアントとKDC間の時刻差(100ナノ秒単位)。
EncodedTicketSizeDWORD4+136+96EncodedTicketのバイト長。
EncodedTicketBYTE*8/4+144+100ASN.1エンコードされたチケット本体への生データポインタ。

各言語での定義

#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 Structure
import 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: pointer
struct 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