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 構造体です。セキュリティ識別子 (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 を設定できます。

公式ドキュメント

LSA_TOKEN_INFORMATION_V2 構造体は、認証パッケージがバージョン 2 の Windows トークンオブジェクトに格納できる情報を保持し、LSA_TOKEN_INFORMATION_V1 に代わるものです。

バージョン 2 のトークン情報は、ほとんどのログオンで使用されます。この構造体は LSA_TOKEN_INFORMATION_V1 構造体と同一ですが、メモリの割り当て方法が異なる点だけが違います。LSA_TOKEN_INFORMATION_V2 構造体は、特権、DACL、SID、およびグループ配列を同じ割り当ての一部に含めるか、外部で割り当ておよび解放することにより、一体的に割り当てられることを想定しています。

バージョン 2 の Windows トークンオブジェクトには、認証パッケージからローカルセキュリティ機関 (LSA) へトークンを構築するために必要なすべての情報が格納されます。LSA はこの情報をカーネルに渡してトークンオブジェクトを作成し、そのトークンオブジェクトのハンドルを LsaLogonUser の呼び出し元に返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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;

// 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