ホーム › Security.Authentication.Identity › KERB_INTERACTIVE_PROFILE
KERB_INTERACTIVE_PROFILE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| MessageType | KERB_PROFILE_BUFFER_TYPE | 4 | +0 | +0 | Kerberosプロファイルバッファ種別を示す列挙値。 |
| LogonCount | WORD | 2 | +4 | +4 | これまでのログオン回数。 |
| BadPasswordCount | WORD | 2 | +6 | +6 | 誤ったパスワードの試行回数。 |
| LogonTime | LONGLONG | 8 | +8 | +8 | ログオン日時(100ナノ秒単位)。 |
| LogoffTime | LONGLONG | 8 | +16 | +16 | 強制ログオフ予定日時(100ナノ秒単位)。 |
| KickOffTime | LONGLONG | 8 | +24 | +24 | 強制切断予定日時(100ナノ秒単位)。 |
| PasswordLastSet | LONGLONG | 8 | +32 | +32 | パスワードが最後に設定された日時(100ナノ秒単位)。 |
| PasswordCanChange | LONGLONG | 8 | +40 | +40 | パスワードを変更可能になる日時(100ナノ秒単位)。 |
| PasswordMustChange | LONGLONG | 8 | +48 | +48 | パスワード変更が必須となる日時(100ナノ秒単位)。 |
| LogonScript | LSA_UNICODE_STRING | 16/8 | +56 | +56 | ログオンスクリプトのパス(LSA_UNICODE_STRING)。 |
| HomeDirectory | LSA_UNICODE_STRING | 16/8 | +72 | +64 | ホームディレクトリのパス(LSA_UNICODE_STRING)。 |
| FullName | LSA_UNICODE_STRING | 16/8 | +88 | +72 | ユーザーのフルネーム(LSA_UNICODE_STRING)。 |
| ProfilePath | LSA_UNICODE_STRING | 16/8 | +104 | +80 | ユーザープロファイルのパス(LSA_UNICODE_STRING)。 |
| HomeDirectoryDrive | LSA_UNICODE_STRING | 16/8 | +120 | +88 | ホームディレクトリのドライブ文字(LSA_UNICODE_STRING)。 |
| LogonServer | LSA_UNICODE_STRING | 16/8 | +136 | +96 | 認証を行ったサーバー名(LSA_UNICODE_STRING)。 |
| UserFlags | DWORD | 4 | +152 | +104 | ユーザーログオンに関するフラグ。 |
各言語での定義
#include <windows.h>
// LSA_UNICODE_STRING (x64 16 / x86 8 バイト)
typedef struct LSA_UNICODE_STRING {
WORD Length;
WORD MaximumLength;
LPWSTR Buffer;
} LSA_UNICODE_STRING;
// KERB_INTERACTIVE_PROFILE (x64 160 / x86 112 バイト)
typedef struct KERB_INTERACTIVE_PROFILE {
KERB_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;
} KERB_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 KERB_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 KERB_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 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 KERB_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 KERB_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 KERB_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;
KERB_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 KERB_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
KERB_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: uint32struct LSA_UNICODE_STRING
{
ushort Length;
ushort MaximumLength;
void* Buffer;
}
struct KERB_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 レイアウト)
; KERB_INTERACTIVE_PROFILE サイズ: 112 バイト(x86)
dim st, 28 ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; MessageType : KERB_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 レイアウト)
; KERB_INTERACTIVE_PROFILE サイズ: 160 バイト(x64)
dim st, 40 ; 4byte整数×40(構造体サイズ 160 / 4 切り上げ)
; MessageType : KERB_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 KERB_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, KERB_INTERACTIVE_PROFILE ; NSTRUCT 変数を確保
st->MessageType = 100
mes "MessageType=" + st->MessageType