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

KERB_TICKET_CACHE_INFO

構造体
サイズx64: 64 バイト / x86: 48 バイト

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

フィールド

フィールドサイズx64x86説明
ServerNameLSA_UNICODE_STRING16/8+0+0チケットが適用されるサーバーの名前を格納する UNICODE_STRING です。この名前は RealmName の値と組み合わされ、完全な名前 ServerName@RealmName になります。
RealmNameLSA_UNICODE_STRING16/8+16+8チケットが適用されるレルムの名前を格納する UNICODE_STRING です。
StartTimeLONGLONG8+32+16チケットが有効になる時刻を格納する FILETIME 構造体です。チケットの starttime メンバーが設定されていない場合、この値は既定でチケットが最初に認証された時刻 authtime になります。チケットの starttime メンバーは省略可能です。
EndTimeLONGLONG8+40+24チケットの有効期限が切れる時刻を格納する FILETIME 構造体です。
RenewTimeLONGLONG8+48+32TicketFlags に KERB_TICKET_FLAGS_renewable が設定されている場合、このメンバーは、チケットを更新できなくなる時刻を格納する FILETIME 構造体です。
EncryptionTypeINT4+56+40チケットで使用される暗号化の種類です。
TicketFlagsKERB_TICKET_FLAGS4+60+44

Internet RFC 4120 で定義されているチケットフラグです。これらのフラグには、次の値のうち 1 つ以上を指定できます。

意味
KERB_TICKET_FLAGS_forwardable
0x40000000
チケット許可サーバーは、提示されたチケットに基づいて、異なるネットワークアドレスを持つ新しいチケット許可チケットを発行できます。
KERB_TICKET_FLAGS_forwarded
0x20000000
チケットが転送されたか、転送されたチケット許可チケットを伴う認証に基づいて発行されました。
KERB_TICKET_FLAGS_hw_authent
0x00100000
初期認証に使用されたプロトコルでは、指定されたクライアントだけが所持していると想定されるハードウェアの使用が必要でした。ハードウェア認証方式は KDC によって選択され、その方式の強度は示されません。
KERB_TICKET_FLAGS_initial
0x00400000
チケットは、チケット許可チケットに基づくのではなく、認証サービス (Authentication Service) プロトコルを使用して発行されました。
KERB_TICKET_FLAGS_invalid
0x01000000
チケットは無効です。
KERB_TICKET_FLAGS_may_postdate
0x04000000
このチケット許可チケットに基づいて、先日付のチケットを発行できることをチケット許可サーバーに示します。
KERB_TICKET_FLAGS_ok_as_delegate
0x00040000
チケットの対象は、ディレクトリサービスによって委任について信頼されています。したがって、クライアントは自身の資格情報をサーバーに委任でき、サーバーは他のサービスと通信する際にクライアントとして動作できます。
KERB_TICKET_FLAGS_postdated
0x02000000
チケットは先日付になっています。エンドサービスは、チケットの authtime メンバーを確認することで、元の認証が行われた時刻を知ることができます。
KERB_TICKET_FLAGS_pre_authent
0x00200000
初期認証時に、チケットが発行される前にクライアントが キー配布センター (KDC) によって認証されました。事前認証方式の強度は示されませんが、KDC にとって受け入れ可能なものです。
KERB_TICKET_FLAGS_proxiable
0x10000000
このチケットに基づいて発行できるのは、異なるネットワークアドレスを持つ、チケット許可チケット以外のチケットのみであることをチケット許可サーバーに示します。
KERB_TICKET_FLAGS_proxy
0x08000000
チケットはプロキシです。
KERB_TICKET_FLAGS_renewable
0x00800000
チケットは更新可能です。このフラグが設定されている場合、チケットを更新できる期限は RenewTime に設定されます。更新可能なチケットは、より後の日時に期限切れとなる代替チケットを取得するために使用できます。
KERB_TICKET_FLAGS_reserved
0x80000000
将来の使用のために予約済みです。このフラグを設定しないでください。
KERB_TICKET_FLAGS_reserved1
0x00000001
予約済みです。

公式ドキュメント

KERB_TICKET_CACHE_INFO 構造体は、キャッシュされた Kerberos チケットに関する情報を格納します。Kerberos チケットは Internet RFC 4120 で定義されています。詳細については、http://www.ietf.org を参照してください。

この構造体は、チケットの取得とチケットキャッシュのクエリの両方に使用できます。 KERB_QUERY_TKT_CACHE_RESPONSE 構造体はこの構造体を使用します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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_TICKET_CACHE_INFO  (x64 64 / x86 48 バイト)
typedef struct KERB_TICKET_CACHE_INFO {
    LSA_UNICODE_STRING ServerName;
    LSA_UNICODE_STRING RealmName;
    LONGLONG StartTime;
    LONGLONG EndTime;
    LONGLONG RenewTime;
    INT EncryptionType;
    KERB_TICKET_FLAGS TicketFlags;
} KERB_TICKET_CACHE_INFO;
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_TICKET_CACHE_INFO
{
    public LSA_UNICODE_STRING ServerName;
    public LSA_UNICODE_STRING RealmName;
    public long StartTime;
    public long EndTime;
    public long RenewTime;
    public int EncryptionType;
    public uint TicketFlags;
}
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_TICKET_CACHE_INFO
    Public ServerName As LSA_UNICODE_STRING
    Public RealmName As LSA_UNICODE_STRING
    Public StartTime As Long
    Public EndTime As Long
    Public RenewTime As Long
    Public EncryptionType As Integer
    Public TicketFlags As UInteger
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_TICKET_CACHE_INFO(ctypes.Structure):
    _fields_ = [
        ("ServerName", LSA_UNICODE_STRING),
        ("RealmName", LSA_UNICODE_STRING),
        ("StartTime", ctypes.c_longlong),
        ("EndTime", ctypes.c_longlong),
        ("RenewTime", ctypes.c_longlong),
        ("EncryptionType", ctypes.c_int),
        ("TicketFlags", wintypes.DWORD),
    ]
#[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_TICKET_CACHE_INFO {
    pub ServerName: LSA_UNICODE_STRING,
    pub RealmName: LSA_UNICODE_STRING,
    pub StartTime: i64,
    pub EndTime: i64,
    pub RenewTime: i64,
    pub EncryptionType: i32,
    pub TicketFlags: u32,
}
import "golang.org/x/sys/windows"

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type KERB_TICKET_CACHE_INFO struct {
	ServerName LSA_UNICODE_STRING
	RealmName LSA_UNICODE_STRING
	StartTime int64
	EndTime int64
	RenewTime int64
	EncryptionType int32
	TicketFlags uint32
}
type
  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  KERB_TICKET_CACHE_INFO = record
    ServerName: LSA_UNICODE_STRING;
    RealmName: LSA_UNICODE_STRING;
    StartTime: Int64;
    EndTime: Int64;
    RenewTime: Int64;
    EncryptionType: Integer;
    TicketFlags: DWORD;
  end;
const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const KERB_TICKET_CACHE_INFO = extern struct {
    ServerName: LSA_UNICODE_STRING,
    RealmName: LSA_UNICODE_STRING,
    StartTime: i64,
    EndTime: i64,
    RenewTime: i64,
    EncryptionType: i32,
    TicketFlags: u32,
};
type
  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  KERB_TICKET_CACHE_INFO {.bycopy.} = object
    ServerName: LSA_UNICODE_STRING
    RealmName: LSA_UNICODE_STRING
    StartTime: int64
    EndTime: int64
    RenewTime: int64
    EncryptionType: int32
    TicketFlags: uint32
struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct KERB_TICKET_CACHE_INFO
{
    LSA_UNICODE_STRING ServerName;
    LSA_UNICODE_STRING RealmName;
    long StartTime;
    long EndTime;
    long RenewTime;
    int EncryptionType;
    uint TicketFlags;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; KERB_TICKET_CACHE_INFO サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; ServerName : LSA_UNICODE_STRING (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; RealmName : LSA_UNICODE_STRING (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; StartTime : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; EndTime : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; RenewTime : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; EncryptionType : INT (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; TicketFlags : KERB_TICKET_FLAGS (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; KERB_TICKET_CACHE_INFO サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; ServerName : LSA_UNICODE_STRING (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; RealmName : LSA_UNICODE_STRING (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; StartTime : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; EndTime : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; RenewTime : LONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; EncryptionType : INT (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; TicketFlags : KERB_TICKET_FLAGS (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ※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_TICKET_CACHE_INFO
    #field LSA_UNICODE_STRING ServerName
    #field LSA_UNICODE_STRING RealmName
    #field int64 StartTime
    #field int64 EndTime
    #field int64 RenewTime
    #field int EncryptionType
    #field int TicketFlags
#endstruct

stdim st, KERB_TICKET_CACHE_INFO        ; NSTRUCT 変数を確保
st->StartTime = 100
mes "StartTime=" + st->StartTime