ホーム › Security.Authentication.Identity › USER_ALL_INFORMATION
USER_ALL_INFORMATION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| LastLogon | LONGLONG | 8 | +0 | +0 | 最終ログオン日時を64ビット時刻で示す。 |
| LastLogoff | LONGLONG | 8 | +8 | +8 | 最終ログオフ日時を64ビット時刻で示す。 |
| PasswordLastSet | LONGLONG | 8 | +16 | +16 | パスワードが最後に設定された日時を64ビット時刻で示す。 |
| AccountExpires | LONGLONG | 8 | +24 | +24 | アカウントの有効期限を64ビット時刻で示す。無期限の場合は最大値。 |
| PasswordCanChange | LONGLONG | 8 | +32 | +32 | パスワードを変更可能になる日時を64ビット時刻で示す。 |
| PasswordMustChange | LONGLONG | 8 | +40 | +40 | パスワード変更が必須となる日時を64ビット時刻で示す。 |
| UserName | LSA_UNICODE_STRING | 16/8 | +48 | +48 | ユーザーのログオン名をUnicode文字列で示す。 |
| FullName | LSA_UNICODE_STRING | 16/8 | +64 | +56 | ユーザーのフルネームをUnicode文字列で示す。 |
| HomeDirectory | LSA_UNICODE_STRING | 16/8 | +80 | +64 | ホームディレクトリのパスをUnicode文字列で示す。 |
| HomeDirectoryDrive | LSA_UNICODE_STRING | 16/8 | +96 | +72 | ホームディレクトリに割り当てるドライブ名を示す。 |
| ScriptPath | LSA_UNICODE_STRING | 16/8 | +112 | +80 | ログオンスクリプトのパスをUnicode文字列で示す。 |
| ProfilePath | LSA_UNICODE_STRING | 16/8 | +128 | +88 | ユーザープロファイルのパスをUnicode文字列で示す。 |
| AdminComment | LSA_UNICODE_STRING | 16/8 | +144 | +96 | 管理者向けコメントをUnicode文字列で示す。 |
| WorkStations | LSA_UNICODE_STRING | 16/8 | +160 | +104 | ログオンを許可するワークステーション名の一覧を示す。 |
| UserComment | LSA_UNICODE_STRING | 16/8 | +176 | +112 | ユーザーコメントをUnicode文字列で示す。 |
| Parameters | LSA_UNICODE_STRING | 16/8 | +192 | +120 | アプリケーション固有のパラメータ文字列を示す。 |
| LmPassword | LSA_UNICODE_STRING | 16/8 | +208 | +128 | LM形式のパスワードハッシュをUnicode文字列構造で示す。 |
| NtPassword | LSA_UNICODE_STRING | 16/8 | +224 | +136 | NT形式のパスワードハッシュをUnicode文字列構造で示す。 |
| PrivateData | LSA_UNICODE_STRING | 16/8 | +240 | +144 | アプリケーション固有のプライベートデータ文字列を示す。 |
| SecurityDescriptor | SR_SECURITY_DESCRIPTOR | 16/8 | +256 | +152 | ユーザーオブジェクトのセキュリティ記述子を保持する。 |
| UserId | DWORD | 4 | +272 | +160 | ユーザーの相対識別子(RID)を示す。 |
| PrimaryGroupId | DWORD | 4 | +276 | +164 | プライマリグループの相対識別子(RID)を示す。 |
| UserAccountControl | DWORD | 4 | +280 | +168 | アカウント制御フラグ(無効・ロック等)のビットマスク。 |
| WhichFields | DWORD | 4 | +284 | +172 | この構造体内のどのフィールドが有効かを示すビットマスク。 |
| LogonHours | LOGON_HOURS | 16/8 | +288 | +176 | ログオン許可時間帯を表すLOGON_HOURS構造を保持する。 |
| BadPasswordCount | WORD | 2 | +304 | +184 | 誤ったパスワード入力の回数を示す。 |
| LogonCount | WORD | 2 | +306 | +186 | ログオンの累計回数を示す。 |
| CountryCode | WORD | 2 | +308 | +188 | ユーザーの国コードを示す。 |
| CodePage | WORD | 2 | +310 | +190 | ユーザーのコードページを示す。 |
| LmPasswordPresent | BOOLEAN | 1 | +312 | +192 | LMパスワードが存在するかを示すブール値。 |
| NtPasswordPresent | BOOLEAN | 1 | +313 | +193 | NTパスワードが存在するかを示すブール値。 |
| PasswordExpired | BOOLEAN | 1 | +314 | +194 | パスワードが期限切れかを示すブール値。 |
| PrivateDataSensitive | BOOLEAN | 1 | +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 Structureimport 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: uint8struct 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