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

LSA_TOKEN_INFORMATION_V1

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

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

フィールド

フィールドサイズx64x86説明
ExpirationTimeLONGLONG8+0+0生成するトークンの有効期限を示すタイムスタンプ。
UserTOKEN_USER16/8+8+8トークンの所有ユーザーSIDを保持するTOKEN_USER。
GroupsTOKEN_GROUPS*8/4+24+16トークンに含めるグループSID群を保持するTOKEN_GROUPSへのポインタ。
PrimaryGroupTOKEN_PRIMARY_GROUP8/4+32+20トークンのプライマリグループSIDを保持するTOKEN_PRIMARY_GROUP。
PrivilegesTOKEN_PRIVILEGES*8/4+40+24トークンに付与する特権群を保持するTOKEN_PRIVILEGESへのポインタ。
OwnerTOKEN_OWNER8/4+48+28新規オブジェクトの既定所有者SIDを保持するTOKEN_OWNER。
DefaultDaclTOKEN_DEFAULT_DACL8/4+56+32新規オブジェクトの既定DACLを保持するTOKEN_DEFAULT_DACL。

各言語での定義

#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;

// LSA_TOKEN_INFORMATION_V1  (x64 64 / x86 40 バイト)
typedef struct LSA_TOKEN_INFORMATION_V1 {
    LONGLONG ExpirationTime;
    TOKEN_USER User;
    TOKEN_GROUPS* Groups;
    TOKEN_PRIMARY_GROUP PrimaryGroup;
    TOKEN_PRIVILEGES* Privileges;
    TOKEN_OWNER Owner;
    TOKEN_DEFAULT_DACL DefaultDacl;
} LSA_TOKEN_INFORMATION_V1;
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 LSA_TOKEN_INFORMATION_V1
{
    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;
}
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 LSA_TOKEN_INFORMATION_V1
    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
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 LSA_TOKEN_INFORMATION_V1(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),
    ]
#[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 LSA_TOKEN_INFORMATION_V1 {
    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,
}
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 LSA_TOKEN_INFORMATION_V1 struct {
	ExpirationTime int64
	User TOKEN_USER
	Groups uintptr
	PrimaryGroup TOKEN_PRIMARY_GROUP
	Privileges uintptr
	Owner TOKEN_OWNER
	DefaultDacl TOKEN_DEFAULT_DACL
}
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;

  LSA_TOKEN_INFORMATION_V1 = record
    ExpirationTime: Int64;
    User: TOKEN_USER;
    Groups: Pointer;
    PrimaryGroup: TOKEN_PRIMARY_GROUP;
    Privileges: Pointer;
    Owner: TOKEN_OWNER;
    DefaultDacl: TOKEN_DEFAULT_DACL;
  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 LSA_TOKEN_INFORMATION_V1 = extern struct {
    ExpirationTime: i64,
    User: TOKEN_USER,
    Groups: ?*anyopaque,
    PrimaryGroup: TOKEN_PRIMARY_GROUP,
    Privileges: ?*anyopaque,
    Owner: TOKEN_OWNER,
    DefaultDacl: TOKEN_DEFAULT_DACL,
};
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

  LSA_TOKEN_INFORMATION_V1 {.bycopy.} = object
    ExpirationTime: int64
    User: TOKEN_USER
    Groups: pointer
    PrimaryGroup: TOKEN_PRIMARY_GROUP
    Privileges: pointer
    Owner: TOKEN_OWNER
    DefaultDacl: TOKEN_DEFAULT_DACL
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 LSA_TOKEN_INFORMATION_V1
{
    long ExpirationTime;
    TOKEN_USER User;
    void* Groups;
    TOKEN_PRIMARY_GROUP PrimaryGroup;
    void* Privileges;
    TOKEN_OWNER Owner;
    TOKEN_DEFAULT_DACL DefaultDacl;
}

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_V1 サイズ: 40 バイト(x86)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 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:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; LSA_TOKEN_INFORMATION_V1 サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 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:入れ子/配列)
; ※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 LSA_TOKEN_INFORMATION_V1
    #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
#endstruct

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