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

LSA_TOKEN_INFORMATION_V3

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

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

フィールド

フィールドサイズx64x86説明
ExpirationTimeLONGLONG8+0+0セキュリティ コンテキストが無効になる時刻です。コンテキストに期限がない場合は、十分に先の未来の値を指定します。現在のバージョンのオペレーティング システム カーネルは、この有効期限を強制しません。
UserTOKEN_USER16/8+8+8ログオンするユーザーの SID を含む TOKEN_USER 構造体です。セキュリティ識別子 (SID) の値は、別個に割り当てられたメモリブロック内に配置されます。
GroupsTOKEN_GROUPS*8/4+24+16

ユーザーが所属するグループの SID を含む TOKEN_GROUPS 構造体です。WORLD やその他のシステム定義・システム割り当ての SID は含めないでください。これらは LSA によって自動的に追加されます。

各 SID は、別個に割り当てられたメモリブロック内にある必要があります。TOKEN_GROUPS 構造体も、別個に割り当てられたメモリブロック内にある必要があります。これらのメモリブロックはすべて、AllocatePrivateHeap 関数を呼び出して割り当ててください。

PrimaryGroupTOKEN_PRIMARY_GROUP8/4+32+20

ユーザーのプライマリ グループを設定するために使用される TOKEN_PRIMARY_GROUP 構造体です。この値は、ユーザーに割り当てられた SID のいずれかと一致している必要はありません。

この構造体が指す SID は、別個に割り当てられたメモリブロック内にある必要があります。

このメンバーは必須であり、必ず設定しなければなりません。

PrivilegesTOKEN_PRIVILEGES*8/4+40+24

ユーザーに割り当てられた特権を含む TOKEN_PRIVILEGES 構造体です。この特権の一覧は、ローカル セキュリティ ポリシーによって割り当てられた特権で拡張または上書きされます。

各特権は、別個に割り当てられたメモリブロック内にある必要があります。TOKEN_PRIVILEGES 構造体も、別個に割り当てられたメモリブロック内にある必要があります。

ユーザーに割り当てる特権がない場合、このメンバーは NULL に設定できます。

OwnerTOKEN_OWNER8/4+48+28

TOKEN_OWNER 構造体です。このメンバーは、既定の所有者を明示的に設定するために使用できます。通常は、ユーザー ID が既定の所有者として使用されます。別の値が必要な場合は、ここで指定します。

代替の既定の所有者値がないことを示すには、Owner.Sid メンバーを NULL に設定できます。

DefaultDaclTOKEN_DEFAULT_DACL8/4+56+32

TOKEN_DEFAULT_DACL 構造体です。このメンバーは、ユーザーの既定の保護を設定するために使用できます。値を指定しない場合は、すべてのユーザーにすべてのアクセスを許可する既定の保護が設定されます。

既定の保護がないことを示すには、DefaultDacl.DefaultDacl メンバーを NULL に設定できます。

UserClaimsTOKEN_USER_CLAIMS8/4+64+36TOKEN_USER_CLAIMS 構造体です。このメンバーは、トークンの不透明なユーザー クレーム BLOB を格納します。トークンに追加のユーザー クレームがないことを示すには、UserClaims メンバーを NULL に設定できます。クレームは許可のみを行うエンティティであるため、クレームを省略するとアクセスが制限される場合があります。
DeviceClaimsTOKEN_DEVICE_CLAIMS8/4+72+40TOKEN_DEVICE_CLAIMS 構造体です。このメンバーは、トークンの不透明なデバイス クレーム BLOB を格納します。トークンに追加のデバイス クレームがないことを示すには、DeviceClaims メンバーを NULL に設定できます。クレームは許可のみを行うエンティティであるため、クレームを省略するとアクセスが制限される場合があります。
DeviceGroupsTOKEN_GROUPS*8/4+80+44

認証を行うデバイス メンバーのグループの SID を含む TOKEN_GROUPS 構造体です。ユーザー グループと同様に、WORLD やその他のシステム定義・システム割り当ての SID は含めないでください。複合化 (compounding) を行わないことを示すには、DeviceGroups メンバーを NULL に設定できます。DeviceGroups が指定されている場合、LSA は WORLD やその他の割り当て済み SID を追加します。

ユーザー グループとは異なり、プライマリ デバイス グループという概念はありません。

各 SID は、別個に割り当てられたメモリブロック内にある必要があります。TOKEN_GROUPS 構造体も、別個に割り当てられたメモリブロック内にある必要があります。

公式ドキュメント

LSA_TOKEN_INFORMATION_V3 構造体は、LSA トークンにクレームのサポートを追加し、認証パッケージがバージョン 3 の Windows トークンオブジェクトに格納できる情報を保持します。この構造体は LSA_TOKEN_INFORMATION_V1 に代わるものです。

バージョン 3 の Windows トークンオブジェクトは、認証パッケージから ローカル セキュリティ機関 (LSA) へトークンを構築するために必要なすべての情報を格納します。LSA はこの情報をカーネルに渡してトークンオブジェクトを作成し、そのトークンオブジェクトのハンドルを LsaLogonUser の呼び出し元に返します。LSA は、この構造体の最初のメンバーが LSA_TOKEN_INFORMATION_V1 構造体のものと同一であることを前提としています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// SID_AND_ATTRIBUTES  (x64 16 / x86 8 バイト)
typedef struct SID_AND_ATTRIBUTES {
    PSID Sid;
    DWORD Attributes;
} SID_AND_ATTRIBUTES;

// TOKEN_USER  (x64 16 / x86 8 バイト)
typedef struct TOKEN_USER {
    SID_AND_ATTRIBUTES User;
} TOKEN_USER;

// TOKEN_PRIMARY_GROUP  (x64 8 / x86 4 バイト)
typedef struct TOKEN_PRIMARY_GROUP {
    PSID PrimaryGroup;
} TOKEN_PRIMARY_GROUP;

// TOKEN_OWNER  (x64 8 / x86 4 バイト)
typedef struct TOKEN_OWNER {
    PSID Owner;
} TOKEN_OWNER;

// TOKEN_DEFAULT_DACL  (x64 8 / x86 4 バイト)
typedef struct TOKEN_DEFAULT_DACL {
    ACL* DefaultDacl;
} TOKEN_DEFAULT_DACL;

// TOKEN_USER_CLAIMS  (x64 8 / x86 4 バイト)
typedef struct TOKEN_USER_CLAIMS {
    void* UserClaims;
} TOKEN_USER_CLAIMS;

// TOKEN_DEVICE_CLAIMS  (x64 8 / x86 4 バイト)
typedef struct TOKEN_DEVICE_CLAIMS {
    void* DeviceClaims;
} TOKEN_DEVICE_CLAIMS;

// LSA_TOKEN_INFORMATION_V3  (x64 88 / x86 48 バイト)
typedef struct LSA_TOKEN_INFORMATION_V3 {
    LONGLONG ExpirationTime;
    TOKEN_USER User;
    TOKEN_GROUPS* Groups;
    TOKEN_PRIMARY_GROUP PrimaryGroup;
    TOKEN_PRIVILEGES* Privileges;
    TOKEN_OWNER Owner;
    TOKEN_DEFAULT_DACL DefaultDacl;
    TOKEN_USER_CLAIMS UserClaims;
    TOKEN_DEVICE_CLAIMS DeviceClaims;
    TOKEN_GROUPS* DeviceGroups;
} LSA_TOKEN_INFORMATION_V3;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SID_AND_ATTRIBUTES
{
    public IntPtr Sid;
    public uint Attributes;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_USER
{
    public SID_AND_ATTRIBUTES User;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_PRIMARY_GROUP
{
    public IntPtr PrimaryGroup;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_OWNER
{
    public IntPtr Owner;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_DEFAULT_DACL
{
    public IntPtr DefaultDacl;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_USER_CLAIMS
{
    public IntPtr UserClaims;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_DEVICE_CLAIMS
{
    public IntPtr DeviceClaims;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LSA_TOKEN_INFORMATION_V3
{
    public long ExpirationTime;
    public TOKEN_USER User;
    public IntPtr Groups;
    public TOKEN_PRIMARY_GROUP PrimaryGroup;
    public IntPtr Privileges;
    public TOKEN_OWNER Owner;
    public TOKEN_DEFAULT_DACL DefaultDacl;
    public TOKEN_USER_CLAIMS UserClaims;
    public TOKEN_DEVICE_CLAIMS DeviceClaims;
    public IntPtr DeviceGroups;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SID_AND_ATTRIBUTES
    Public Sid As IntPtr
    Public Attributes As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_USER
    Public User As SID_AND_ATTRIBUTES
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_PRIMARY_GROUP
    Public PrimaryGroup As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_OWNER
    Public Owner As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_DEFAULT_DACL
    Public DefaultDacl As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_USER_CLAIMS
    Public UserClaims As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_DEVICE_CLAIMS
    Public DeviceClaims As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LSA_TOKEN_INFORMATION_V3
    Public ExpirationTime As Long
    Public User As TOKEN_USER
    Public Groups As IntPtr
    Public PrimaryGroup As TOKEN_PRIMARY_GROUP
    Public Privileges As IntPtr
    Public Owner As TOKEN_OWNER
    Public DefaultDacl As TOKEN_DEFAULT_DACL
    Public UserClaims As TOKEN_USER_CLAIMS
    Public DeviceClaims As TOKEN_DEVICE_CLAIMS
    Public DeviceGroups As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class SID_AND_ATTRIBUTES(ctypes.Structure):
    _fields_ = [
        ("Sid", ctypes.c_void_p),
        ("Attributes", wintypes.DWORD),
    ]

class TOKEN_USER(ctypes.Structure):
    _fields_ = [
        ("User", SID_AND_ATTRIBUTES),
    ]

class TOKEN_PRIMARY_GROUP(ctypes.Structure):
    _fields_ = [
        ("PrimaryGroup", ctypes.c_void_p),
    ]

class TOKEN_OWNER(ctypes.Structure):
    _fields_ = [
        ("Owner", ctypes.c_void_p),
    ]

class TOKEN_DEFAULT_DACL(ctypes.Structure):
    _fields_ = [
        ("DefaultDacl", ctypes.c_void_p),
    ]

class TOKEN_USER_CLAIMS(ctypes.Structure):
    _fields_ = [
        ("UserClaims", ctypes.c_void_p),
    ]

class TOKEN_DEVICE_CLAIMS(ctypes.Structure):
    _fields_ = [
        ("DeviceClaims", ctypes.c_void_p),
    ]

class LSA_TOKEN_INFORMATION_V3(ctypes.Structure):
    _fields_ = [
        ("ExpirationTime", ctypes.c_longlong),
        ("User", TOKEN_USER),
        ("Groups", ctypes.c_void_p),
        ("PrimaryGroup", TOKEN_PRIMARY_GROUP),
        ("Privileges", ctypes.c_void_p),
        ("Owner", TOKEN_OWNER),
        ("DefaultDacl", TOKEN_DEFAULT_DACL),
        ("UserClaims", TOKEN_USER_CLAIMS),
        ("DeviceClaims", TOKEN_DEVICE_CLAIMS),
        ("DeviceGroups", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct SID_AND_ATTRIBUTES {
    pub Sid: *mut core::ffi::c_void,
    pub Attributes: u32,
}

#[repr(C)]
pub struct TOKEN_USER {
    pub User: SID_AND_ATTRIBUTES,
}

#[repr(C)]
pub struct TOKEN_PRIMARY_GROUP {
    pub PrimaryGroup: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct TOKEN_OWNER {
    pub Owner: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct TOKEN_DEFAULT_DACL {
    pub DefaultDacl: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct TOKEN_USER_CLAIMS {
    pub UserClaims: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct TOKEN_DEVICE_CLAIMS {
    pub DeviceClaims: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct LSA_TOKEN_INFORMATION_V3 {
    pub ExpirationTime: i64,
    pub User: TOKEN_USER,
    pub Groups: *mut core::ffi::c_void,
    pub PrimaryGroup: TOKEN_PRIMARY_GROUP,
    pub Privileges: *mut core::ffi::c_void,
    pub Owner: TOKEN_OWNER,
    pub DefaultDacl: TOKEN_DEFAULT_DACL,
    pub UserClaims: TOKEN_USER_CLAIMS,
    pub DeviceClaims: TOKEN_DEVICE_CLAIMS,
    pub DeviceGroups: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type SID_AND_ATTRIBUTES struct {
	Sid uintptr
	Attributes uint32
}

type TOKEN_USER struct {
	User SID_AND_ATTRIBUTES
}

type TOKEN_PRIMARY_GROUP struct {
	PrimaryGroup uintptr
}

type TOKEN_OWNER struct {
	Owner uintptr
}

type TOKEN_DEFAULT_DACL struct {
	DefaultDacl uintptr
}

type TOKEN_USER_CLAIMS struct {
	UserClaims uintptr
}

type TOKEN_DEVICE_CLAIMS struct {
	DeviceClaims uintptr
}

type LSA_TOKEN_INFORMATION_V3 struct {
	ExpirationTime int64
	User TOKEN_USER
	Groups uintptr
	PrimaryGroup TOKEN_PRIMARY_GROUP
	Privileges uintptr
	Owner TOKEN_OWNER
	DefaultDacl TOKEN_DEFAULT_DACL
	UserClaims TOKEN_USER_CLAIMS
	DeviceClaims TOKEN_DEVICE_CLAIMS
	DeviceGroups uintptr
}
type
  SID_AND_ATTRIBUTES = record
    Sid: Pointer;
    Attributes: DWORD;
  end;

  TOKEN_USER = record
    User: SID_AND_ATTRIBUTES;
  end;

  TOKEN_PRIMARY_GROUP = record
    PrimaryGroup: Pointer;
  end;

  TOKEN_OWNER = record
    Owner: Pointer;
  end;

  TOKEN_DEFAULT_DACL = record
    DefaultDacl: Pointer;
  end;

  TOKEN_USER_CLAIMS = record
    UserClaims: Pointer;
  end;

  TOKEN_DEVICE_CLAIMS = record
    DeviceClaims: Pointer;
  end;

  LSA_TOKEN_INFORMATION_V3 = record
    ExpirationTime: Int64;
    User: TOKEN_USER;
    Groups: Pointer;
    PrimaryGroup: TOKEN_PRIMARY_GROUP;
    Privileges: Pointer;
    Owner: TOKEN_OWNER;
    DefaultDacl: TOKEN_DEFAULT_DACL;
    UserClaims: TOKEN_USER_CLAIMS;
    DeviceClaims: TOKEN_DEVICE_CLAIMS;
    DeviceGroups: Pointer;
  end;
const SID_AND_ATTRIBUTES = extern struct {
    Sid: ?*anyopaque,
    Attributes: u32,
};

const TOKEN_USER = extern struct {
    User: SID_AND_ATTRIBUTES,
};

const TOKEN_PRIMARY_GROUP = extern struct {
    PrimaryGroup: ?*anyopaque,
};

const TOKEN_OWNER = extern struct {
    Owner: ?*anyopaque,
};

const TOKEN_DEFAULT_DACL = extern struct {
    DefaultDacl: ?*anyopaque,
};

const TOKEN_USER_CLAIMS = extern struct {
    UserClaims: ?*anyopaque,
};

const TOKEN_DEVICE_CLAIMS = extern struct {
    DeviceClaims: ?*anyopaque,
};

const LSA_TOKEN_INFORMATION_V3 = extern struct {
    ExpirationTime: i64,
    User: TOKEN_USER,
    Groups: ?*anyopaque,
    PrimaryGroup: TOKEN_PRIMARY_GROUP,
    Privileges: ?*anyopaque,
    Owner: TOKEN_OWNER,
    DefaultDacl: TOKEN_DEFAULT_DACL,
    UserClaims: TOKEN_USER_CLAIMS,
    DeviceClaims: TOKEN_DEVICE_CLAIMS,
    DeviceGroups: ?*anyopaque,
};
type
  SID_AND_ATTRIBUTES {.bycopy.} = object
    Sid: pointer
    Attributes: uint32

  TOKEN_USER {.bycopy.} = object
    User: SID_AND_ATTRIBUTES

  TOKEN_PRIMARY_GROUP {.bycopy.} = object
    PrimaryGroup: pointer

  TOKEN_OWNER {.bycopy.} = object
    Owner: pointer

  TOKEN_DEFAULT_DACL {.bycopy.} = object
    DefaultDacl: pointer

  TOKEN_USER_CLAIMS {.bycopy.} = object
    UserClaims: pointer

  TOKEN_DEVICE_CLAIMS {.bycopy.} = object
    DeviceClaims: pointer

  LSA_TOKEN_INFORMATION_V3 {.bycopy.} = object
    ExpirationTime: int64
    User: TOKEN_USER
    Groups: pointer
    PrimaryGroup: TOKEN_PRIMARY_GROUP
    Privileges: pointer
    Owner: TOKEN_OWNER
    DefaultDacl: TOKEN_DEFAULT_DACL
    UserClaims: TOKEN_USER_CLAIMS
    DeviceClaims: TOKEN_DEVICE_CLAIMS
    DeviceGroups: pointer
struct SID_AND_ATTRIBUTES
{
    void* Sid;
    uint Attributes;
}

struct TOKEN_USER
{
    SID_AND_ATTRIBUTES User;
}

struct TOKEN_PRIMARY_GROUP
{
    void* PrimaryGroup;
}

struct TOKEN_OWNER
{
    void* Owner;
}

struct TOKEN_DEFAULT_DACL
{
    void* DefaultDacl;
}

struct TOKEN_USER_CLAIMS
{
    void* UserClaims;
}

struct TOKEN_DEVICE_CLAIMS
{
    void* DeviceClaims;
}

struct LSA_TOKEN_INFORMATION_V3
{
    long ExpirationTime;
    TOKEN_USER User;
    void* Groups;
    TOKEN_PRIMARY_GROUP PrimaryGroup;
    void* Privileges;
    TOKEN_OWNER Owner;
    TOKEN_DEFAULT_DACL DefaultDacl;
    TOKEN_USER_CLAIMS UserClaims;
    TOKEN_DEVICE_CLAIMS DeviceClaims;
    void* DeviceGroups;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; LSA_TOKEN_INFORMATION_V3 サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; ExpirationTime : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; User : TOKEN_USER (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Groups : TOKEN_GROUPS* (+16, 4byte)  varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; PrimaryGroup : TOKEN_PRIMARY_GROUP (+20, 4byte)  varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; Privileges : TOKEN_PRIVILEGES* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; Owner : TOKEN_OWNER (+28, 4byte)  varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; DefaultDacl : TOKEN_DEFAULT_DACL (+32, 4byte)  varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; UserClaims : TOKEN_USER_CLAIMS (+36, 4byte)  varptr(st)+36 を基点に操作(4byte:入れ子/配列)
; DeviceClaims : TOKEN_DEVICE_CLAIMS (+40, 4byte)  varptr(st)+40 を基点に操作(4byte:入れ子/配列)
; DeviceGroups : TOKEN_GROUPS* (+44, 4byte)  varptr(st)+44 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; LSA_TOKEN_INFORMATION_V3 サイズ: 88 バイト(x64)
dim st, 22    ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; ExpirationTime : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; User : TOKEN_USER (+8, 16byte)  varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; Groups : TOKEN_GROUPS* (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; PrimaryGroup : TOKEN_PRIMARY_GROUP (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; Privileges : TOKEN_PRIVILEGES* (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; Owner : TOKEN_OWNER (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; DefaultDacl : TOKEN_DEFAULT_DACL (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; UserClaims : TOKEN_USER_CLAIMS (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; DeviceClaims : TOKEN_DEVICE_CLAIMS (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; DeviceGroups : TOKEN_GROUPS* (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SID_AND_ATTRIBUTES
    #field intptr Sid
    #field int Attributes
#endstruct

#defstruct global TOKEN_USER
    #field SID_AND_ATTRIBUTES User
#endstruct

#defstruct global TOKEN_PRIMARY_GROUP
    #field intptr PrimaryGroup
#endstruct

#defstruct global TOKEN_OWNER
    #field intptr Owner
#endstruct

#defstruct global TOKEN_DEFAULT_DACL
    #field intptr DefaultDacl
#endstruct

#defstruct global TOKEN_USER_CLAIMS
    #field intptr UserClaims
#endstruct

#defstruct global TOKEN_DEVICE_CLAIMS
    #field intptr DeviceClaims
#endstruct

#defstruct global LSA_TOKEN_INFORMATION_V3
    #field int64 ExpirationTime
    #field TOKEN_USER User
    #field intptr Groups
    #field TOKEN_PRIMARY_GROUP PrimaryGroup
    #field intptr Privileges
    #field TOKEN_OWNER Owner
    #field TOKEN_DEFAULT_DACL DefaultDacl
    #field TOKEN_USER_CLAIMS UserClaims
    #field TOKEN_DEVICE_CLAIMS DeviceClaims
    #field intptr DeviceGroups
#endstruct

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