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

MSV1_0_INTERACTIVE_PROFILE

構造体
サイズx64: 160 バイト / x86: 112 バイト

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

フィールド

フィールドサイズx64x86説明
MessageTypeMSV1_0_PROFILE_BUFFER_TYPE4+0+0返されるプロファイルデータの種類を示す MSV1_0_PROFILE_BUFFER_TYPE 値です。このメンバーには MsV1_0InteractiveProfile を設定しなければなりません。
LogonCountWORD2+4+4

ユーザーが現在ログオンしている回数です。

メモ ドメインコントローラーにはすべてのログオンおよびログオフが通知されるわけではないため、この値が正確であるとは限りません。
BadPasswordCountWORD2+6+6最後に成功したログオン以降に、このアカウントに対して無効なパスワードが入力された回数です。
LogonTimeLONGLONG8+8+8ユーザーが最後にログオンした時刻です。これは絶対形式の Windows 標準時刻値です。
LogoffTimeLONGLONG8+16+16ユーザーがログオフすべき時刻です。これは絶対形式の Windows 標準時刻値です。
KickOffTimeLONGLONG8+24+24システムがユーザーを強制的にログオフさせるべき時刻です。これは絶対形式の Windows 標準時刻値です。なお、Windows のユーザーが対話的に強制ログオフさせられることはありませんが、ネットワーク接続は切断される場合があります。
PasswordLastSetLONGLONG8+32+32パスワードが最後に変更された日時です。これは絶対形式の Windows 標準時刻値です。
PasswordCanChangeLONGLONG8+40+40ユーザーにパスワードの変更を促すべき日時です。これは絶対形式の Windows 標準時刻値です。このメンバーは、現在のパスワードを変更するかどうかをユーザーに確認するプロンプトを表示するために GINA が使用します。
PasswordMustChangeLONGLONG8+48+48ユーザーがパスワードを変更しなければならない日時です。ユーザーがパスワードを変更できない場合、このメンバーは未定義です。これは絶対形式の Windows 標準時刻値です。
LogonScriptLSA_UNICODE_STRING16/8+56+56アカウントのログオンスクリプトへの相対パスを格納する UNICODE_STRING です。
HomeDirectoryLSA_UNICODE_STRING16/8+72+64ユーザーのホームディレクトリを格納する UNICODE_STRING です。
FullNameLSA_UNICODE_STRING16/8+88+72ユーザーのフルネームを格納する UNICODE_STRING です。
ProfilePathLSA_UNICODE_STRING16/8+104+80ユーザーが移動プロファイルを持つ場合に、その移動プロファイルへのパスを指定する UNICODE_STRING です。例: \SomeServer\SomeShare\MyUserName
HomeDirectoryDriveLSA_UNICODE_STRING16/8+120+88ホームディレクトリのドライブ文字 (例: C:\ または D:) を格納する UNICODE_STRING です。
LogonServerLSA_UNICODE_STRING16/8+136+96ログオン要求を処理したサーバーの名前を格納する UNICODE_STRING です。
UserFlagsDWORD4+152+104

このユーザーがどのようにセッションを確立したかを指定します。次のフラグを指定できます。

意味
LOGON_EXTRA_SIDS
ユーザーは追加のセキュリティ識別子 (SID) を使用してログオンしました。

公式ドキュメント

MSV1_0_INTERACTIVE_PROFILE 構造体は、対話型ログオンプロファイルに関する情報を格納します。

この構造体は LsaLogonUser 関数で使用されます。

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

各言語での定義

#include <windows.h>

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

// MSV1_0_INTERACTIVE_PROFILE  (x64 160 / x86 112 バイト)
typedef struct MSV1_0_INTERACTIVE_PROFILE {
    MSV1_0_PROFILE_BUFFER_TYPE MessageType;
    WORD LogonCount;
    WORD BadPasswordCount;
    LONGLONG LogonTime;
    LONGLONG LogoffTime;
    LONGLONG KickOffTime;
    LONGLONG PasswordLastSet;
    LONGLONG PasswordCanChange;
    LONGLONG PasswordMustChange;
    LSA_UNICODE_STRING LogonScript;
    LSA_UNICODE_STRING HomeDirectory;
    LSA_UNICODE_STRING FullName;
    LSA_UNICODE_STRING ProfilePath;
    LSA_UNICODE_STRING HomeDirectoryDrive;
    LSA_UNICODE_STRING LogonServer;
    DWORD UserFlags;
} MSV1_0_INTERACTIVE_PROFILE;
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 MSV1_0_INTERACTIVE_PROFILE
{
    public int MessageType;
    public ushort LogonCount;
    public ushort BadPasswordCount;
    public long LogonTime;
    public long LogoffTime;
    public long KickOffTime;
    public long PasswordLastSet;
    public long PasswordCanChange;
    public long PasswordMustChange;
    public LSA_UNICODE_STRING LogonScript;
    public LSA_UNICODE_STRING HomeDirectory;
    public LSA_UNICODE_STRING FullName;
    public LSA_UNICODE_STRING ProfilePath;
    public LSA_UNICODE_STRING HomeDirectoryDrive;
    public LSA_UNICODE_STRING LogonServer;
    public uint UserFlags;
}
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 MSV1_0_INTERACTIVE_PROFILE
    Public MessageType As Integer
    Public LogonCount As UShort
    Public BadPasswordCount As UShort
    Public LogonTime As Long
    Public LogoffTime As Long
    Public KickOffTime As Long
    Public PasswordLastSet As Long
    Public PasswordCanChange As Long
    Public PasswordMustChange As Long
    Public LogonScript As LSA_UNICODE_STRING
    Public HomeDirectory As LSA_UNICODE_STRING
    Public FullName As LSA_UNICODE_STRING
    Public ProfilePath As LSA_UNICODE_STRING
    Public HomeDirectoryDrive As LSA_UNICODE_STRING
    Public LogonServer As LSA_UNICODE_STRING
    Public UserFlags As UInteger
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 MSV1_0_INTERACTIVE_PROFILE(ctypes.Structure):
    _fields_ = [
        ("MessageType", ctypes.c_int),
        ("LogonCount", ctypes.c_ushort),
        ("BadPasswordCount", ctypes.c_ushort),
        ("LogonTime", ctypes.c_longlong),
        ("LogoffTime", ctypes.c_longlong),
        ("KickOffTime", ctypes.c_longlong),
        ("PasswordLastSet", ctypes.c_longlong),
        ("PasswordCanChange", ctypes.c_longlong),
        ("PasswordMustChange", ctypes.c_longlong),
        ("LogonScript", LSA_UNICODE_STRING),
        ("HomeDirectory", LSA_UNICODE_STRING),
        ("FullName", LSA_UNICODE_STRING),
        ("ProfilePath", LSA_UNICODE_STRING),
        ("HomeDirectoryDrive", LSA_UNICODE_STRING),
        ("LogonServer", LSA_UNICODE_STRING),
        ("UserFlags", wintypes.DWORD),
    ]
#[repr(C)]
pub struct LSA_UNICODE_STRING {
    pub Length: u16,
    pub MaximumLength: u16,
    pub Buffer: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct MSV1_0_INTERACTIVE_PROFILE {
    pub MessageType: i32,
    pub LogonCount: u16,
    pub BadPasswordCount: u16,
    pub LogonTime: i64,
    pub LogoffTime: i64,
    pub KickOffTime: i64,
    pub PasswordLastSet: i64,
    pub PasswordCanChange: i64,
    pub PasswordMustChange: i64,
    pub LogonScript: LSA_UNICODE_STRING,
    pub HomeDirectory: LSA_UNICODE_STRING,
    pub FullName: LSA_UNICODE_STRING,
    pub ProfilePath: LSA_UNICODE_STRING,
    pub HomeDirectoryDrive: LSA_UNICODE_STRING,
    pub LogonServer: LSA_UNICODE_STRING,
    pub UserFlags: u32,
}
import "golang.org/x/sys/windows"

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type MSV1_0_INTERACTIVE_PROFILE struct {
	MessageType int32
	LogonCount uint16
	BadPasswordCount uint16
	LogonTime int64
	LogoffTime int64
	KickOffTime int64
	PasswordLastSet int64
	PasswordCanChange int64
	PasswordMustChange int64
	LogonScript LSA_UNICODE_STRING
	HomeDirectory LSA_UNICODE_STRING
	FullName LSA_UNICODE_STRING
	ProfilePath LSA_UNICODE_STRING
	HomeDirectoryDrive LSA_UNICODE_STRING
	LogonServer LSA_UNICODE_STRING
	UserFlags uint32
}
type
  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  MSV1_0_INTERACTIVE_PROFILE = record
    MessageType: Integer;
    LogonCount: Word;
    BadPasswordCount: Word;
    LogonTime: Int64;
    LogoffTime: Int64;
    KickOffTime: Int64;
    PasswordLastSet: Int64;
    PasswordCanChange: Int64;
    PasswordMustChange: Int64;
    LogonScript: LSA_UNICODE_STRING;
    HomeDirectory: LSA_UNICODE_STRING;
    FullName: LSA_UNICODE_STRING;
    ProfilePath: LSA_UNICODE_STRING;
    HomeDirectoryDrive: LSA_UNICODE_STRING;
    LogonServer: LSA_UNICODE_STRING;
    UserFlags: DWORD;
  end;
const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const MSV1_0_INTERACTIVE_PROFILE = extern struct {
    MessageType: i32,
    LogonCount: u16,
    BadPasswordCount: u16,
    LogonTime: i64,
    LogoffTime: i64,
    KickOffTime: i64,
    PasswordLastSet: i64,
    PasswordCanChange: i64,
    PasswordMustChange: i64,
    LogonScript: LSA_UNICODE_STRING,
    HomeDirectory: LSA_UNICODE_STRING,
    FullName: LSA_UNICODE_STRING,
    ProfilePath: LSA_UNICODE_STRING,
    HomeDirectoryDrive: LSA_UNICODE_STRING,
    LogonServer: LSA_UNICODE_STRING,
    UserFlags: u32,
};
type
  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  MSV1_0_INTERACTIVE_PROFILE {.bycopy.} = object
    MessageType: int32
    LogonCount: uint16
    BadPasswordCount: uint16
    LogonTime: int64
    LogoffTime: int64
    KickOffTime: int64
    PasswordLastSet: int64
    PasswordCanChange: int64
    PasswordMustChange: int64
    LogonScript: LSA_UNICODE_STRING
    HomeDirectory: LSA_UNICODE_STRING
    FullName: LSA_UNICODE_STRING
    ProfilePath: LSA_UNICODE_STRING
    HomeDirectoryDrive: LSA_UNICODE_STRING
    LogonServer: LSA_UNICODE_STRING
    UserFlags: uint32
struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct MSV1_0_INTERACTIVE_PROFILE
{
    int MessageType;
    ushort LogonCount;
    ushort BadPasswordCount;
    long LogonTime;
    long LogoffTime;
    long KickOffTime;
    long PasswordLastSet;
    long PasswordCanChange;
    long PasswordMustChange;
    LSA_UNICODE_STRING LogonScript;
    LSA_UNICODE_STRING HomeDirectory;
    LSA_UNICODE_STRING FullName;
    LSA_UNICODE_STRING ProfilePath;
    LSA_UNICODE_STRING HomeDirectoryDrive;
    LSA_UNICODE_STRING LogonServer;
    uint UserFlags;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; MSV1_0_INTERACTIVE_PROFILE サイズ: 112 バイト(x86)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; MessageType : MSV1_0_PROFILE_BUFFER_TYPE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; LogonCount : WORD (+4, 2byte)  wpoke st,4,値  /  値 = wpeek(st,4)
; BadPasswordCount : WORD (+6, 2byte)  wpoke st,6,値  /  値 = wpeek(st,6)
; LogonTime : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LogoffTime : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; KickOffTime : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; PasswordLastSet : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; PasswordCanChange : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; PasswordMustChange : LONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; LogonScript : LSA_UNICODE_STRING (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; HomeDirectory : LSA_UNICODE_STRING (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; FullName : LSA_UNICODE_STRING (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; ProfilePath : LSA_UNICODE_STRING (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; HomeDirectoryDrive : LSA_UNICODE_STRING (+88, 8byte)  varptr(st)+88 を基点に操作(8byte:入れ子/配列)
; LogonServer : LSA_UNICODE_STRING (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; UserFlags : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MSV1_0_INTERACTIVE_PROFILE サイズ: 160 バイト(x64)
dim st, 40    ; 4byte整数×40(構造体サイズ 160 / 4 切り上げ)
; MessageType : MSV1_0_PROFILE_BUFFER_TYPE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; LogonCount : WORD (+4, 2byte)  wpoke st,4,値  /  値 = wpeek(st,4)
; BadPasswordCount : WORD (+6, 2byte)  wpoke st,6,値  /  値 = wpeek(st,6)
; LogonTime : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LogoffTime : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; KickOffTime : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; PasswordLastSet : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; PasswordCanChange : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; PasswordMustChange : LONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; LogonScript : LSA_UNICODE_STRING (+56, 16byte)  varptr(st)+56 を基点に操作(16byte:入れ子/配列)
; HomeDirectory : LSA_UNICODE_STRING (+72, 16byte)  varptr(st)+72 を基点に操作(16byte:入れ子/配列)
; FullName : LSA_UNICODE_STRING (+88, 16byte)  varptr(st)+88 を基点に操作(16byte:入れ子/配列)
; ProfilePath : LSA_UNICODE_STRING (+104, 16byte)  varptr(st)+104 を基点に操作(16byte:入れ子/配列)
; HomeDirectoryDrive : LSA_UNICODE_STRING (+120, 16byte)  varptr(st)+120 を基点に操作(16byte:入れ子/配列)
; LogonServer : LSA_UNICODE_STRING (+136, 16byte)  varptr(st)+136 を基点に操作(16byte:入れ子/配列)
; UserFlags : DWORD (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; ※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 MSV1_0_INTERACTIVE_PROFILE
    #field int MessageType
    #field short LogonCount
    #field short BadPasswordCount
    #field int64 LogonTime
    #field int64 LogoffTime
    #field int64 KickOffTime
    #field int64 PasswordLastSet
    #field int64 PasswordCanChange
    #field int64 PasswordMustChange
    #field LSA_UNICODE_STRING LogonScript
    #field LSA_UNICODE_STRING HomeDirectory
    #field LSA_UNICODE_STRING FullName
    #field LSA_UNICODE_STRING ProfilePath
    #field LSA_UNICODE_STRING HomeDirectoryDrive
    #field LSA_UNICODE_STRING LogonServer
    #field int UserFlags
#endstruct

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