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

KERB_S4U2PROXY_CRED

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

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

フィールド

フィールドサイズx64x86説明
UserNameLSA_UNICODE_STRING16/8+0+0S4U2Proxy資格情報のユーザー名(LSA_UNICODE_STRING)。
DomainNameLSA_UNICODE_STRING16/8+16+8ユーザーのドメイン名(LSA_UNICODE_STRING)。
FlagsDWORD4+32+16資格情報に関するフラグ。
LastStatusNTSTATUS4+36+20最後の操作結果を示すNTSTATUS値。
ExpiryLONGLONG8+40+24資格情報の有効期限(100ナノ秒単位)。
CountOfEntriesDWORD4+48+32Entries配列に含まれるキャッシュエントリ数。
EntriesKERB_S4U2PROXY_CACHE_ENTRY_INFO*8/4+56+36S4U2Proxyキャッシュエントリの配列へのポインタ。

各言語での定義

#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_S4U2PROXY_CRED  (x64 64 / x86 40 バイト)
typedef struct KERB_S4U2PROXY_CRED {
    LSA_UNICODE_STRING UserName;
    LSA_UNICODE_STRING DomainName;
    DWORD Flags;
    NTSTATUS LastStatus;
    LONGLONG Expiry;
    DWORD CountOfEntries;
    KERB_S4U2PROXY_CACHE_ENTRY_INFO* Entries;
} KERB_S4U2PROXY_CRED;
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_S4U2PROXY_CRED
{
    public LSA_UNICODE_STRING UserName;
    public LSA_UNICODE_STRING DomainName;
    public uint Flags;
    public int LastStatus;
    public long Expiry;
    public uint CountOfEntries;
    public IntPtr Entries;
}
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_S4U2PROXY_CRED
    Public UserName As LSA_UNICODE_STRING
    Public DomainName As LSA_UNICODE_STRING
    Public Flags As UInteger
    Public LastStatus As Integer
    Public Expiry As Long
    Public CountOfEntries As UInteger
    Public Entries 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_S4U2PROXY_CRED(ctypes.Structure):
    _fields_ = [
        ("UserName", LSA_UNICODE_STRING),
        ("DomainName", LSA_UNICODE_STRING),
        ("Flags", wintypes.DWORD),
        ("LastStatus", ctypes.c_int),
        ("Expiry", ctypes.c_longlong),
        ("CountOfEntries", wintypes.DWORD),
        ("Entries", 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_S4U2PROXY_CRED {
    pub UserName: LSA_UNICODE_STRING,
    pub DomainName: LSA_UNICODE_STRING,
    pub Flags: u32,
    pub LastStatus: i32,
    pub Expiry: i64,
    pub CountOfEntries: u32,
    pub Entries: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type KERB_S4U2PROXY_CRED struct {
	UserName LSA_UNICODE_STRING
	DomainName LSA_UNICODE_STRING
	Flags uint32
	LastStatus int32
	Expiry int64
	CountOfEntries uint32
	Entries uintptr
}
type
  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  KERB_S4U2PROXY_CRED = record
    UserName: LSA_UNICODE_STRING;
    DomainName: LSA_UNICODE_STRING;
    Flags: DWORD;
    LastStatus: Integer;
    Expiry: Int64;
    CountOfEntries: DWORD;
    Entries: Pointer;
  end;
const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const KERB_S4U2PROXY_CRED = extern struct {
    UserName: LSA_UNICODE_STRING,
    DomainName: LSA_UNICODE_STRING,
    Flags: u32,
    LastStatus: i32,
    Expiry: i64,
    CountOfEntries: u32,
    Entries: ?*anyopaque,
};
type
  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  KERB_S4U2PROXY_CRED {.bycopy.} = object
    UserName: LSA_UNICODE_STRING
    DomainName: LSA_UNICODE_STRING
    Flags: uint32
    LastStatus: int32
    Expiry: int64
    CountOfEntries: uint32
    Entries: pointer
struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct KERB_S4U2PROXY_CRED
{
    LSA_UNICODE_STRING UserName;
    LSA_UNICODE_STRING DomainName;
    uint Flags;
    int LastStatus;
    long Expiry;
    uint CountOfEntries;
    void* Entries;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; KERB_S4U2PROXY_CRED サイズ: 40 バイト(x86)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; UserName : LSA_UNICODE_STRING (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Flags : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; LastStatus : NTSTATUS (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Expiry : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; CountOfEntries : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; Entries : KERB_S4U2PROXY_CACHE_ENTRY_INFO* (+36, 4byte)  varptr(st)+36 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; KERB_S4U2PROXY_CRED サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; UserName : LSA_UNICODE_STRING (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; Flags : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; LastStatus : NTSTATUS (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Expiry : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; CountOfEntries : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; Entries : KERB_S4U2PROXY_CACHE_ENTRY_INFO* (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; ※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_S4U2PROXY_CRED
    #field LSA_UNICODE_STRING UserName
    #field LSA_UNICODE_STRING DomainName
    #field int Flags
    #field int LastStatus
    #field int64 Expiry
    #field int CountOfEntries
    #field intptr Entries
#endstruct

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