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

USER_ALL_INFORMATION

構造体
サイズx64: 316 バイト / x86: 196 バイトパッキング4

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

フィールド

フィールドサイズx64x86説明
LastLogonLONGLONG8+0+0最終ログオン日時を64ビット時刻で示す。
LastLogoffLONGLONG8+8+8最終ログオフ日時を64ビット時刻で示す。
PasswordLastSetLONGLONG8+16+16パスワードが最後に設定された日時を64ビット時刻で示す。
AccountExpiresLONGLONG8+24+24アカウントの有効期限を64ビット時刻で示す。無期限の場合は最大値。
PasswordCanChangeLONGLONG8+32+32パスワードを変更可能になる日時を64ビット時刻で示す。
PasswordMustChangeLONGLONG8+40+40パスワード変更が必須となる日時を64ビット時刻で示す。
UserNameLSA_UNICODE_STRING16/8+48+48ユーザーのログオン名をUnicode文字列で示す。
FullNameLSA_UNICODE_STRING16/8+64+56ユーザーのフルネームをUnicode文字列で示す。
HomeDirectoryLSA_UNICODE_STRING16/8+80+64ホームディレクトリのパスをUnicode文字列で示す。
HomeDirectoryDriveLSA_UNICODE_STRING16/8+96+72ホームディレクトリに割り当てるドライブ名を示す。
ScriptPathLSA_UNICODE_STRING16/8+112+80ログオンスクリプトのパスをUnicode文字列で示す。
ProfilePathLSA_UNICODE_STRING16/8+128+88ユーザープロファイルのパスをUnicode文字列で示す。
AdminCommentLSA_UNICODE_STRING16/8+144+96管理者向けコメントをUnicode文字列で示す。
WorkStationsLSA_UNICODE_STRING16/8+160+104ログオンを許可するワークステーション名の一覧を示す。
UserCommentLSA_UNICODE_STRING16/8+176+112ユーザーコメントをUnicode文字列で示す。
ParametersLSA_UNICODE_STRING16/8+192+120アプリケーション固有のパラメータ文字列を示す。
LmPasswordLSA_UNICODE_STRING16/8+208+128LM形式のパスワードハッシュをUnicode文字列構造で示す。
NtPasswordLSA_UNICODE_STRING16/8+224+136NT形式のパスワードハッシュをUnicode文字列構造で示す。
PrivateDataLSA_UNICODE_STRING16/8+240+144アプリケーション固有のプライベートデータ文字列を示す。
SecurityDescriptorSR_SECURITY_DESCRIPTOR16/8+256+152ユーザーオブジェクトのセキュリティ記述子を保持する。
UserIdDWORD4+272+160ユーザーの相対識別子(RID)を示す。
PrimaryGroupIdDWORD4+276+164プライマリグループの相対識別子(RID)を示す。
UserAccountControlDWORD4+280+168アカウント制御フラグ(無効・ロック等)のビットマスク。
WhichFieldsDWORD4+284+172この構造体内のどのフィールドが有効かを示すビットマスク。
LogonHoursLOGON_HOURS16/8+288+176ログオン許可時間帯を表すLOGON_HOURS構造を保持する。
BadPasswordCountWORD2+304+184誤ったパスワード入力の回数を示す。
LogonCountWORD2+306+186ログオンの累計回数を示す。
CountryCodeWORD2+308+188ユーザーの国コードを示す。
CodePageWORD2+310+190ユーザーのコードページを示す。
LmPasswordPresentBOOLEAN1+312+192LMパスワードが存在するかを示すブール値。
NtPasswordPresentBOOLEAN1+313+193NTパスワードが存在するかを示すブール値。
PasswordExpiredBOOLEAN1+314+194パスワードが期限切れかを示すブール値。
PrivateDataSensitiveBOOLEAN1+315+195プライベートデータが機密扱いかを示すブール値。

各言語での定義

#include <windows.h>

// LSA_UNICODE_STRING  (x64 16 / x86 8 バイト)
typedef struct LSA_UNICODE_STRING {
    WORD Length;
    WORD MaximumLength;
    LPWSTR Buffer;
} LSA_UNICODE_STRING;

// SR_SECURITY_DESCRIPTOR  (x64 16 / x86 8 バイト)
typedef struct SR_SECURITY_DESCRIPTOR {
    DWORD Length;
    BYTE* SecurityDescriptor;
} SR_SECURITY_DESCRIPTOR;

// LOGON_HOURS  (x64 16 / x86 8 バイト)
typedef struct LOGON_HOURS {
    WORD UnitsPerWeek;
    BYTE* LogonHours;
} LOGON_HOURS;

// USER_ALL_INFORMATION  (x64 316 / x86 196 バイト)
#pragma pack(push, 4)
typedef struct USER_ALL_INFORMATION {
    LONGLONG LastLogon;
    LONGLONG LastLogoff;
    LONGLONG PasswordLastSet;
    LONGLONG AccountExpires;
    LONGLONG PasswordCanChange;
    LONGLONG PasswordMustChange;
    LSA_UNICODE_STRING UserName;
    LSA_UNICODE_STRING FullName;
    LSA_UNICODE_STRING HomeDirectory;
    LSA_UNICODE_STRING HomeDirectoryDrive;
    LSA_UNICODE_STRING ScriptPath;
    LSA_UNICODE_STRING ProfilePath;
    LSA_UNICODE_STRING AdminComment;
    LSA_UNICODE_STRING WorkStations;
    LSA_UNICODE_STRING UserComment;
    LSA_UNICODE_STRING Parameters;
    LSA_UNICODE_STRING LmPassword;
    LSA_UNICODE_STRING NtPassword;
    LSA_UNICODE_STRING PrivateData;
    SR_SECURITY_DESCRIPTOR SecurityDescriptor;
    DWORD UserId;
    DWORD PrimaryGroupId;
    DWORD UserAccountControl;
    DWORD WhichFields;
    LOGON_HOURS LogonHours;
    WORD BadPasswordCount;
    WORD LogonCount;
    WORD CountryCode;
    WORD CodePage;
    BOOLEAN LmPasswordPresent;
    BOOLEAN NtPasswordPresent;
    BOOLEAN PasswordExpired;
    BOOLEAN PrivateDataSensitive;
} USER_ALL_INFORMATION;
#pragma pack(pop)
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 SR_SECURITY_DESCRIPTOR
{
    public uint Length;
    public IntPtr SecurityDescriptor;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LOGON_HOURS
{
    public ushort UnitsPerWeek;
    public IntPtr LogonHours;
}

[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
public struct USER_ALL_INFORMATION
{
    public long LastLogon;
    public long LastLogoff;
    public long PasswordLastSet;
    public long AccountExpires;
    public long PasswordCanChange;
    public long PasswordMustChange;
    public LSA_UNICODE_STRING UserName;
    public LSA_UNICODE_STRING FullName;
    public LSA_UNICODE_STRING HomeDirectory;
    public LSA_UNICODE_STRING HomeDirectoryDrive;
    public LSA_UNICODE_STRING ScriptPath;
    public LSA_UNICODE_STRING ProfilePath;
    public LSA_UNICODE_STRING AdminComment;
    public LSA_UNICODE_STRING WorkStations;
    public LSA_UNICODE_STRING UserComment;
    public LSA_UNICODE_STRING Parameters;
    public LSA_UNICODE_STRING LmPassword;
    public LSA_UNICODE_STRING NtPassword;
    public LSA_UNICODE_STRING PrivateData;
    public SR_SECURITY_DESCRIPTOR SecurityDescriptor;
    public uint UserId;
    public uint PrimaryGroupId;
    public uint UserAccountControl;
    public uint WhichFields;
    public LOGON_HOURS LogonHours;
    public ushort BadPasswordCount;
    public ushort LogonCount;
    public ushort CountryCode;
    public ushort CodePage;
    [MarshalAs(UnmanagedType.U1)] public bool LmPasswordPresent;
    [MarshalAs(UnmanagedType.U1)] public bool NtPasswordPresent;
    [MarshalAs(UnmanagedType.U1)] public bool PasswordExpired;
    [MarshalAs(UnmanagedType.U1)] public bool PrivateDataSensitive;
}
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 SR_SECURITY_DESCRIPTOR
    Public Length As UInteger
    Public SecurityDescriptor As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LOGON_HOURS
    Public UnitsPerWeek As UShort
    Public LogonHours As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=4, CharSet:=CharSet.Unicode)>
Public Structure USER_ALL_INFORMATION
    Public LastLogon As Long
    Public LastLogoff As Long
    Public PasswordLastSet As Long
    Public AccountExpires As Long
    Public PasswordCanChange As Long
    Public PasswordMustChange As Long
    Public UserName As LSA_UNICODE_STRING
    Public FullName As LSA_UNICODE_STRING
    Public HomeDirectory As LSA_UNICODE_STRING
    Public HomeDirectoryDrive As LSA_UNICODE_STRING
    Public ScriptPath As LSA_UNICODE_STRING
    Public ProfilePath As LSA_UNICODE_STRING
    Public AdminComment As LSA_UNICODE_STRING
    Public WorkStations As LSA_UNICODE_STRING
    Public UserComment As LSA_UNICODE_STRING
    Public Parameters As LSA_UNICODE_STRING
    Public LmPassword As LSA_UNICODE_STRING
    Public NtPassword As LSA_UNICODE_STRING
    Public PrivateData As LSA_UNICODE_STRING
    Public SecurityDescriptor As SR_SECURITY_DESCRIPTOR
    Public UserId As UInteger
    Public PrimaryGroupId As UInteger
    Public UserAccountControl As UInteger
    Public WhichFields As UInteger
    Public LogonHours As LOGON_HOURS
    Public BadPasswordCount As UShort
    Public LogonCount As UShort
    Public CountryCode As UShort
    Public CodePage As UShort
    <MarshalAs(UnmanagedType.U1)> Public LmPasswordPresent As Boolean
    <MarshalAs(UnmanagedType.U1)> Public NtPasswordPresent As Boolean
    <MarshalAs(UnmanagedType.U1)> Public PasswordExpired As Boolean
    <MarshalAs(UnmanagedType.U1)> Public PrivateDataSensitive As Boolean
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 SR_SECURITY_DESCRIPTOR(ctypes.Structure):
    _fields_ = [
        ("Length", wintypes.DWORD),
        ("SecurityDescriptor", ctypes.c_void_p),
    ]

class LOGON_HOURS(ctypes.Structure):
    _fields_ = [
        ("UnitsPerWeek", ctypes.c_ushort),
        ("LogonHours", ctypes.c_void_p),
    ]

class USER_ALL_INFORMATION(ctypes.Structure):
    _pack_ = 4
    _fields_ = [
        ("LastLogon", ctypes.c_longlong),
        ("LastLogoff", ctypes.c_longlong),
        ("PasswordLastSet", ctypes.c_longlong),
        ("AccountExpires", ctypes.c_longlong),
        ("PasswordCanChange", ctypes.c_longlong),
        ("PasswordMustChange", ctypes.c_longlong),
        ("UserName", LSA_UNICODE_STRING),
        ("FullName", LSA_UNICODE_STRING),
        ("HomeDirectory", LSA_UNICODE_STRING),
        ("HomeDirectoryDrive", LSA_UNICODE_STRING),
        ("ScriptPath", LSA_UNICODE_STRING),
        ("ProfilePath", LSA_UNICODE_STRING),
        ("AdminComment", LSA_UNICODE_STRING),
        ("WorkStations", LSA_UNICODE_STRING),
        ("UserComment", LSA_UNICODE_STRING),
        ("Parameters", LSA_UNICODE_STRING),
        ("LmPassword", LSA_UNICODE_STRING),
        ("NtPassword", LSA_UNICODE_STRING),
        ("PrivateData", LSA_UNICODE_STRING),
        ("SecurityDescriptor", SR_SECURITY_DESCRIPTOR),
        ("UserId", wintypes.DWORD),
        ("PrimaryGroupId", wintypes.DWORD),
        ("UserAccountControl", wintypes.DWORD),
        ("WhichFields", wintypes.DWORD),
        ("LogonHours", LOGON_HOURS),
        ("BadPasswordCount", ctypes.c_ushort),
        ("LogonCount", ctypes.c_ushort),
        ("CountryCode", ctypes.c_ushort),
        ("CodePage", ctypes.c_ushort),
        ("LmPasswordPresent", ctypes.c_byte),
        ("NtPasswordPresent", ctypes.c_byte),
        ("PasswordExpired", ctypes.c_byte),
        ("PrivateDataSensitive", ctypes.c_byte),
    ]
#[repr(C)]
pub struct LSA_UNICODE_STRING {
    pub Length: u16,
    pub MaximumLength: u16,
    pub Buffer: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct SR_SECURITY_DESCRIPTOR {
    pub Length: u32,
    pub SecurityDescriptor: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct LOGON_HOURS {
    pub UnitsPerWeek: u16,
    pub LogonHours: *mut core::ffi::c_void,
}

#[repr(C, packed(4))]
pub struct USER_ALL_INFORMATION {
    pub LastLogon: i64,
    pub LastLogoff: i64,
    pub PasswordLastSet: i64,
    pub AccountExpires: i64,
    pub PasswordCanChange: i64,
    pub PasswordMustChange: i64,
    pub UserName: LSA_UNICODE_STRING,
    pub FullName: LSA_UNICODE_STRING,
    pub HomeDirectory: LSA_UNICODE_STRING,
    pub HomeDirectoryDrive: LSA_UNICODE_STRING,
    pub ScriptPath: LSA_UNICODE_STRING,
    pub ProfilePath: LSA_UNICODE_STRING,
    pub AdminComment: LSA_UNICODE_STRING,
    pub WorkStations: LSA_UNICODE_STRING,
    pub UserComment: LSA_UNICODE_STRING,
    pub Parameters: LSA_UNICODE_STRING,
    pub LmPassword: LSA_UNICODE_STRING,
    pub NtPassword: LSA_UNICODE_STRING,
    pub PrivateData: LSA_UNICODE_STRING,
    pub SecurityDescriptor: SR_SECURITY_DESCRIPTOR,
    pub UserId: u32,
    pub PrimaryGroupId: u32,
    pub UserAccountControl: u32,
    pub WhichFields: u32,
    pub LogonHours: LOGON_HOURS,
    pub BadPasswordCount: u16,
    pub LogonCount: u16,
    pub CountryCode: u16,
    pub CodePage: u16,
    pub LmPasswordPresent: u8,
    pub NtPasswordPresent: u8,
    pub PasswordExpired: u8,
    pub PrivateDataSensitive: u8,
}
import "golang.org/x/sys/windows"

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type SR_SECURITY_DESCRIPTOR struct {
	Length uint32
	SecurityDescriptor uintptr
}

type LOGON_HOURS struct {
	UnitsPerWeek uint16
	LogonHours uintptr
}

type USER_ALL_INFORMATION struct {
	LastLogon int64
	LastLogoff int64
	PasswordLastSet int64
	AccountExpires int64
	PasswordCanChange int64
	PasswordMustChange int64
	UserName LSA_UNICODE_STRING
	FullName LSA_UNICODE_STRING
	HomeDirectory LSA_UNICODE_STRING
	HomeDirectoryDrive LSA_UNICODE_STRING
	ScriptPath LSA_UNICODE_STRING
	ProfilePath LSA_UNICODE_STRING
	AdminComment LSA_UNICODE_STRING
	WorkStations LSA_UNICODE_STRING
	UserComment LSA_UNICODE_STRING
	Parameters LSA_UNICODE_STRING
	LmPassword LSA_UNICODE_STRING
	NtPassword LSA_UNICODE_STRING
	PrivateData LSA_UNICODE_STRING
	SecurityDescriptor SR_SECURITY_DESCRIPTOR
	UserId uint32
	PrimaryGroupId uint32
	UserAccountControl uint32
	WhichFields uint32
	LogonHours LOGON_HOURS
	BadPasswordCount uint16
	LogonCount uint16
	CountryCode uint16
	CodePage uint16
	LmPasswordPresent byte
	NtPasswordPresent byte
	PasswordExpired byte
	PrivateDataSensitive byte
}
type
  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  SR_SECURITY_DESCRIPTOR = record
    Length: DWORD;
    SecurityDescriptor: Pointer;
  end;

  LOGON_HOURS = record
    UnitsPerWeek: Word;
    LogonHours: Pointer;
  end;

  USER_ALL_INFORMATION = packed record
    LastLogon: Int64;
    LastLogoff: Int64;
    PasswordLastSet: Int64;
    AccountExpires: Int64;
    PasswordCanChange: Int64;
    PasswordMustChange: Int64;
    UserName: LSA_UNICODE_STRING;
    FullName: LSA_UNICODE_STRING;
    HomeDirectory: LSA_UNICODE_STRING;
    HomeDirectoryDrive: LSA_UNICODE_STRING;
    ScriptPath: LSA_UNICODE_STRING;
    ProfilePath: LSA_UNICODE_STRING;
    AdminComment: LSA_UNICODE_STRING;
    WorkStations: LSA_UNICODE_STRING;
    UserComment: LSA_UNICODE_STRING;
    Parameters: LSA_UNICODE_STRING;
    LmPassword: LSA_UNICODE_STRING;
    NtPassword: LSA_UNICODE_STRING;
    PrivateData: LSA_UNICODE_STRING;
    SecurityDescriptor: SR_SECURITY_DESCRIPTOR;
    UserId: DWORD;
    PrimaryGroupId: DWORD;
    UserAccountControl: DWORD;
    WhichFields: DWORD;
    LogonHours: LOGON_HOURS;
    BadPasswordCount: Word;
    LogonCount: Word;
    CountryCode: Word;
    CodePage: Word;
    LmPasswordPresent: ByteBool;
    NtPasswordPresent: ByteBool;
    PasswordExpired: ByteBool;
    PrivateDataSensitive: ByteBool;
  end;
const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const SR_SECURITY_DESCRIPTOR = extern struct {
    Length: u32,
    SecurityDescriptor: ?*anyopaque,
};

const LOGON_HOURS = extern struct {
    UnitsPerWeek: u16,
    LogonHours: ?*anyopaque,
};

const USER_ALL_INFORMATION = extern struct {
    LastLogon: i64,
    LastLogoff: i64,
    PasswordLastSet: i64,
    AccountExpires: i64,
    PasswordCanChange: i64,
    PasswordMustChange: i64,
    UserName: LSA_UNICODE_STRING,
    FullName: LSA_UNICODE_STRING,
    HomeDirectory: LSA_UNICODE_STRING,
    HomeDirectoryDrive: LSA_UNICODE_STRING,
    ScriptPath: LSA_UNICODE_STRING,
    ProfilePath: LSA_UNICODE_STRING,
    AdminComment: LSA_UNICODE_STRING,
    WorkStations: LSA_UNICODE_STRING,
    UserComment: LSA_UNICODE_STRING,
    Parameters: LSA_UNICODE_STRING,
    LmPassword: LSA_UNICODE_STRING,
    NtPassword: LSA_UNICODE_STRING,
    PrivateData: LSA_UNICODE_STRING,
    SecurityDescriptor: SR_SECURITY_DESCRIPTOR,
    UserId: u32,
    PrimaryGroupId: u32,
    UserAccountControl: u32,
    WhichFields: u32,
    LogonHours: LOGON_HOURS,
    BadPasswordCount: u16,
    LogonCount: u16,
    CountryCode: u16,
    CodePage: u16,
    LmPasswordPresent: u8,
    NtPasswordPresent: u8,
    PasswordExpired: u8,
    PrivateDataSensitive: u8,
};
type
  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  SR_SECURITY_DESCRIPTOR {.bycopy.} = object
    Length: uint32
    SecurityDescriptor: pointer

  LOGON_HOURS {.bycopy.} = object
    UnitsPerWeek: uint16
    LogonHours: pointer

  USER_ALL_INFORMATION {.packed.} = object
    LastLogon: int64
    LastLogoff: int64
    PasswordLastSet: int64
    AccountExpires: int64
    PasswordCanChange: int64
    PasswordMustChange: int64
    UserName: LSA_UNICODE_STRING
    FullName: LSA_UNICODE_STRING
    HomeDirectory: LSA_UNICODE_STRING
    HomeDirectoryDrive: LSA_UNICODE_STRING
    ScriptPath: LSA_UNICODE_STRING
    ProfilePath: LSA_UNICODE_STRING
    AdminComment: LSA_UNICODE_STRING
    WorkStations: LSA_UNICODE_STRING
    UserComment: LSA_UNICODE_STRING
    Parameters: LSA_UNICODE_STRING
    LmPassword: LSA_UNICODE_STRING
    NtPassword: LSA_UNICODE_STRING
    PrivateData: LSA_UNICODE_STRING
    SecurityDescriptor: SR_SECURITY_DESCRIPTOR
    UserId: uint32
    PrimaryGroupId: uint32
    UserAccountControl: uint32
    WhichFields: uint32
    LogonHours: LOGON_HOURS
    BadPasswordCount: uint16
    LogonCount: uint16
    CountryCode: uint16
    CodePage: uint16
    LmPasswordPresent: uint8
    NtPasswordPresent: uint8
    PasswordExpired: uint8
    PrivateDataSensitive: uint8
struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct SR_SECURITY_DESCRIPTOR
{
    uint Length;
    void* SecurityDescriptor;
}

struct LOGON_HOURS
{
    ushort UnitsPerWeek;
    void* LogonHours;
}

align(4)
struct USER_ALL_INFORMATION
{
    long LastLogon;
    long LastLogoff;
    long PasswordLastSet;
    long AccountExpires;
    long PasswordCanChange;
    long PasswordMustChange;
    LSA_UNICODE_STRING UserName;
    LSA_UNICODE_STRING FullName;
    LSA_UNICODE_STRING HomeDirectory;
    LSA_UNICODE_STRING HomeDirectoryDrive;
    LSA_UNICODE_STRING ScriptPath;
    LSA_UNICODE_STRING ProfilePath;
    LSA_UNICODE_STRING AdminComment;
    LSA_UNICODE_STRING WorkStations;
    LSA_UNICODE_STRING UserComment;
    LSA_UNICODE_STRING Parameters;
    LSA_UNICODE_STRING LmPassword;
    LSA_UNICODE_STRING NtPassword;
    LSA_UNICODE_STRING PrivateData;
    SR_SECURITY_DESCRIPTOR SecurityDescriptor;
    uint UserId;
    uint PrimaryGroupId;
    uint UserAccountControl;
    uint WhichFields;
    LOGON_HOURS LogonHours;
    ushort BadPasswordCount;
    ushort LogonCount;
    ushort CountryCode;
    ushort CodePage;
    ubyte LmPasswordPresent;
    ubyte NtPasswordPresent;
    ubyte PasswordExpired;
    ubyte PrivateDataSensitive;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; USER_ALL_INFORMATION サイズ: 196 バイト(x86)
dim st, 49    ; 4byte整数×49(構造体サイズ 196 / 4 切り上げ)
; LastLogon : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; LastLogoff : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; PasswordLastSet : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; AccountExpires : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; PasswordCanChange : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; PasswordMustChange : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; UserName : LSA_UNICODE_STRING (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; FullName : LSA_UNICODE_STRING (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; HomeDirectory : LSA_UNICODE_STRING (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; HomeDirectoryDrive : LSA_UNICODE_STRING (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; ScriptPath : LSA_UNICODE_STRING (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; ProfilePath : LSA_UNICODE_STRING (+88, 8byte)  varptr(st)+88 を基点に操作(8byte:入れ子/配列)
; AdminComment : LSA_UNICODE_STRING (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; WorkStations : LSA_UNICODE_STRING (+104, 8byte)  varptr(st)+104 を基点に操作(8byte:入れ子/配列)
; UserComment : LSA_UNICODE_STRING (+112, 8byte)  varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; Parameters : LSA_UNICODE_STRING (+120, 8byte)  varptr(st)+120 を基点に操作(8byte:入れ子/配列)
; LmPassword : LSA_UNICODE_STRING (+128, 8byte)  varptr(st)+128 を基点に操作(8byte:入れ子/配列)
; NtPassword : LSA_UNICODE_STRING (+136, 8byte)  varptr(st)+136 を基点に操作(8byte:入れ子/配列)
; PrivateData : LSA_UNICODE_STRING (+144, 8byte)  varptr(st)+144 を基点に操作(8byte:入れ子/配列)
; SecurityDescriptor : SR_SECURITY_DESCRIPTOR (+152, 8byte)  varptr(st)+152 を基点に操作(8byte:入れ子/配列)
; UserId : DWORD (+160, 4byte)  st.40 = 値  /  値 = st.40   (lpoke/lpeek も可)
; PrimaryGroupId : DWORD (+164, 4byte)  st.41 = 値  /  値 = st.41   (lpoke/lpeek も可)
; UserAccountControl : DWORD (+168, 4byte)  st.42 = 値  /  値 = st.42   (lpoke/lpeek も可)
; WhichFields : DWORD (+172, 4byte)  st.43 = 値  /  値 = st.43   (lpoke/lpeek も可)
; LogonHours : LOGON_HOURS (+176, 8byte)  varptr(st)+176 を基点に操作(8byte:入れ子/配列)
; BadPasswordCount : WORD (+184, 2byte)  wpoke st,184,値  /  値 = wpeek(st,184)
; LogonCount : WORD (+186, 2byte)  wpoke st,186,値  /  値 = wpeek(st,186)
; CountryCode : WORD (+188, 2byte)  wpoke st,188,値  /  値 = wpeek(st,188)
; CodePage : WORD (+190, 2byte)  wpoke st,190,値  /  値 = wpeek(st,190)
; LmPasswordPresent : BOOLEAN (+192, 1byte)  poke st,192,値  /  値 = peek(st,192)
; NtPasswordPresent : BOOLEAN (+193, 1byte)  poke st,193,値  /  値 = peek(st,193)
; PasswordExpired : BOOLEAN (+194, 1byte)  poke st,194,値  /  値 = peek(st,194)
; PrivateDataSensitive : BOOLEAN (+195, 1byte)  poke st,195,値  /  値 = peek(st,195)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; USER_ALL_INFORMATION サイズ: 316 バイト(x64)
dim st, 79    ; 4byte整数×79(構造体サイズ 316 / 4 切り上げ)
; LastLogon : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; LastLogoff : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; PasswordLastSet : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; AccountExpires : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; PasswordCanChange : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; PasswordMustChange : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; UserName : LSA_UNICODE_STRING (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; FullName : LSA_UNICODE_STRING (+64, 16byte)  varptr(st)+64 を基点に操作(16byte:入れ子/配列)
; HomeDirectory : LSA_UNICODE_STRING (+80, 16byte)  varptr(st)+80 を基点に操作(16byte:入れ子/配列)
; HomeDirectoryDrive : LSA_UNICODE_STRING (+96, 16byte)  varptr(st)+96 を基点に操作(16byte:入れ子/配列)
; ScriptPath : LSA_UNICODE_STRING (+112, 16byte)  varptr(st)+112 を基点に操作(16byte:入れ子/配列)
; ProfilePath : LSA_UNICODE_STRING (+128, 16byte)  varptr(st)+128 を基点に操作(16byte:入れ子/配列)
; AdminComment : LSA_UNICODE_STRING (+144, 16byte)  varptr(st)+144 を基点に操作(16byte:入れ子/配列)
; WorkStations : LSA_UNICODE_STRING (+160, 16byte)  varptr(st)+160 を基点に操作(16byte:入れ子/配列)
; UserComment : LSA_UNICODE_STRING (+176, 16byte)  varptr(st)+176 を基点に操作(16byte:入れ子/配列)
; Parameters : LSA_UNICODE_STRING (+192, 16byte)  varptr(st)+192 を基点に操作(16byte:入れ子/配列)
; LmPassword : LSA_UNICODE_STRING (+208, 16byte)  varptr(st)+208 を基点に操作(16byte:入れ子/配列)
; NtPassword : LSA_UNICODE_STRING (+224, 16byte)  varptr(st)+224 を基点に操作(16byte:入れ子/配列)
; PrivateData : LSA_UNICODE_STRING (+240, 16byte)  varptr(st)+240 を基点に操作(16byte:入れ子/配列)
; SecurityDescriptor : SR_SECURITY_DESCRIPTOR (+256, 16byte)  varptr(st)+256 を基点に操作(16byte:入れ子/配列)
; UserId : DWORD (+272, 4byte)  st.68 = 値  /  値 = st.68   (lpoke/lpeek も可)
; PrimaryGroupId : DWORD (+276, 4byte)  st.69 = 値  /  値 = st.69   (lpoke/lpeek も可)
; UserAccountControl : DWORD (+280, 4byte)  st.70 = 値  /  値 = st.70   (lpoke/lpeek も可)
; WhichFields : DWORD (+284, 4byte)  st.71 = 値  /  値 = st.71   (lpoke/lpeek も可)
; LogonHours : LOGON_HOURS (+288, 16byte)  varptr(st)+288 を基点に操作(16byte:入れ子/配列)
; BadPasswordCount : WORD (+304, 2byte)  wpoke st,304,値  /  値 = wpeek(st,304)
; LogonCount : WORD (+306, 2byte)  wpoke st,306,値  /  値 = wpeek(st,306)
; CountryCode : WORD (+308, 2byte)  wpoke st,308,値  /  値 = wpeek(st,308)
; CodePage : WORD (+310, 2byte)  wpoke st,310,値  /  値 = wpeek(st,310)
; LmPasswordPresent : BOOLEAN (+312, 1byte)  poke st,312,値  /  値 = peek(st,312)
; NtPasswordPresent : BOOLEAN (+313, 1byte)  poke st,313,値  /  値 = peek(st,313)
; PasswordExpired : BOOLEAN (+314, 1byte)  poke st,314,値  /  値 = peek(st,314)
; PrivateDataSensitive : BOOLEAN (+315, 1byte)  poke st,315,値  /  値 = peek(st,315)
; ※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 SR_SECURITY_DESCRIPTOR
    #field int Length
    #field intptr SecurityDescriptor
#endstruct

#defstruct global LOGON_HOURS
    #field short UnitsPerWeek
    #field intptr LogonHours
#endstruct

#defstruct global USER_ALL_INFORMATION, pack=4
    #field int64 LastLogon
    #field int64 LastLogoff
    #field int64 PasswordLastSet
    #field int64 AccountExpires
    #field int64 PasswordCanChange
    #field int64 PasswordMustChange
    #field LSA_UNICODE_STRING UserName
    #field LSA_UNICODE_STRING FullName
    #field LSA_UNICODE_STRING HomeDirectory
    #field LSA_UNICODE_STRING HomeDirectoryDrive
    #field LSA_UNICODE_STRING ScriptPath
    #field LSA_UNICODE_STRING ProfilePath
    #field LSA_UNICODE_STRING AdminComment
    #field LSA_UNICODE_STRING WorkStations
    #field LSA_UNICODE_STRING UserComment
    #field LSA_UNICODE_STRING Parameters
    #field LSA_UNICODE_STRING LmPassword
    #field LSA_UNICODE_STRING NtPassword
    #field LSA_UNICODE_STRING PrivateData
    #field SR_SECURITY_DESCRIPTOR SecurityDescriptor
    #field int UserId
    #field int PrimaryGroupId
    #field int UserAccountControl
    #field int WhichFields
    #field LOGON_HOURS LogonHours
    #field short BadPasswordCount
    #field short LogonCount
    #field short CountryCode
    #field short CodePage
    #field bool1 LmPasswordPresent
    #field bool1 NtPasswordPresent
    #field bool1 PasswordExpired
    #field bool1 PrivateDataSensitive
#endstruct

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