ホーム › Security.Authentication.Identity › SECPKG_CLIENT_INFO_EX
SECPKG_CLIENT_INFO_EX
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| LogonId | LUID | 8 | +0 | +0 | クライアントのログオンセッションを識別するLUID。 |
| ProcessID | DWORD | 4 | +8 | +8 | クライアントプロセスのID。 |
| ThreadID | DWORD | 4 | +12 | +12 | 呼び出しを行ったクライアントスレッドのID。 |
| HasTcbPrivilege | BOOLEAN | 1 | +16 | +16 | クライアントがTCB特権を持つかを示す真偽値。 |
| Impersonating | BOOLEAN | 1 | +17 | +17 | クライアントが他者になりすまし中かを示す真偽値。 |
| Restricted | BOOLEAN | 1 | +18 | +18 | クライアントトークンが制限付きかを示す真偽値。 |
| ClientFlags | BYTE | 1 | +19 | +19 | クライアントの状態を示すビットフラグ。 |
| ImpersonationLevel | SECURITY_IMPERSONATION_LEVEL | 4 | +20 | +20 | クライアントの偽装レベルを示すSECURITY_IMPERSONATION_LEVEL列挙値。 |
| ClientToken | HANDLE | 8/4 | +24 | +24 | クライアントのアクセストークンを参照するハンドル。 |
| IdentificationLogonId | LUID | 8 | +32 | +28 | 識別用に用いるログオンセッションを識別するLUID。 |
| IdentificationToken | HANDLE | 8/4 | +40 | +36 | 識別レベルのアクセストークンを参照するハンドル。 |
各言語での定義
#include <windows.h>
// LUID (x64 8 / x86 8 バイト)
typedef struct LUID {
DWORD LowPart;
INT HighPart;
} LUID;
// SECPKG_CLIENT_INFO_EX (x64 48 / x86 40 バイト)
typedef struct SECPKG_CLIENT_INFO_EX {
LUID LogonId;
DWORD ProcessID;
DWORD ThreadID;
BOOLEAN HasTcbPrivilege;
BOOLEAN Impersonating;
BOOLEAN Restricted;
BYTE ClientFlags;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
HANDLE ClientToken;
LUID IdentificationLogonId;
HANDLE IdentificationToken;
} SECPKG_CLIENT_INFO_EX;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LUID
{
public uint LowPart;
public int HighPart;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SECPKG_CLIENT_INFO_EX
{
public LUID LogonId;
public uint ProcessID;
public uint ThreadID;
[MarshalAs(UnmanagedType.U1)] public bool HasTcbPrivilege;
[MarshalAs(UnmanagedType.U1)] public bool Impersonating;
[MarshalAs(UnmanagedType.U1)] public bool Restricted;
public byte ClientFlags;
public int ImpersonationLevel;
public IntPtr ClientToken;
public LUID IdentificationLogonId;
public IntPtr IdentificationToken;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LUID
Public LowPart As UInteger
Public HighPart As Integer
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SECPKG_CLIENT_INFO_EX
Public LogonId As LUID
Public ProcessID As UInteger
Public ThreadID As UInteger
<MarshalAs(UnmanagedType.U1)> Public HasTcbPrivilege As Boolean
<MarshalAs(UnmanagedType.U1)> Public Impersonating As Boolean
<MarshalAs(UnmanagedType.U1)> Public Restricted As Boolean
Public ClientFlags As Byte
Public ImpersonationLevel As Integer
Public ClientToken As IntPtr
Public IdentificationLogonId As LUID
Public IdentificationToken As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class LUID(ctypes.Structure):
_fields_ = [
("LowPart", wintypes.DWORD),
("HighPart", ctypes.c_int),
]
class SECPKG_CLIENT_INFO_EX(ctypes.Structure):
_fields_ = [
("LogonId", LUID),
("ProcessID", wintypes.DWORD),
("ThreadID", wintypes.DWORD),
("HasTcbPrivilege", ctypes.c_byte),
("Impersonating", ctypes.c_byte),
("Restricted", ctypes.c_byte),
("ClientFlags", ctypes.c_ubyte),
("ImpersonationLevel", ctypes.c_int),
("ClientToken", ctypes.c_void_p),
("IdentificationLogonId", LUID),
("IdentificationToken", ctypes.c_void_p),
]#[repr(C)]
pub struct LUID {
pub LowPart: u32,
pub HighPart: i32,
}
#[repr(C)]
pub struct SECPKG_CLIENT_INFO_EX {
pub LogonId: LUID,
pub ProcessID: u32,
pub ThreadID: u32,
pub HasTcbPrivilege: u8,
pub Impersonating: u8,
pub Restricted: u8,
pub ClientFlags: u8,
pub ImpersonationLevel: i32,
pub ClientToken: *mut core::ffi::c_void,
pub IdentificationLogonId: LUID,
pub IdentificationToken: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type LUID struct {
LowPart uint32
HighPart int32
}
type SECPKG_CLIENT_INFO_EX struct {
LogonId LUID
ProcessID uint32
ThreadID uint32
HasTcbPrivilege byte
Impersonating byte
Restricted byte
ClientFlags byte
ImpersonationLevel int32
ClientToken uintptr
IdentificationLogonId LUID
IdentificationToken uintptr
}type
LUID = record
LowPart: DWORD;
HighPart: Integer;
end;
SECPKG_CLIENT_INFO_EX = record
LogonId: LUID;
ProcessID: DWORD;
ThreadID: DWORD;
HasTcbPrivilege: ByteBool;
Impersonating: ByteBool;
Restricted: ByteBool;
ClientFlags: Byte;
ImpersonationLevel: Integer;
ClientToken: Pointer;
IdentificationLogonId: LUID;
IdentificationToken: Pointer;
end;const LUID = extern struct {
LowPart: u32,
HighPart: i32,
};
const SECPKG_CLIENT_INFO_EX = extern struct {
LogonId: LUID,
ProcessID: u32,
ThreadID: u32,
HasTcbPrivilege: u8,
Impersonating: u8,
Restricted: u8,
ClientFlags: u8,
ImpersonationLevel: i32,
ClientToken: ?*anyopaque,
IdentificationLogonId: LUID,
IdentificationToken: ?*anyopaque,
};type
LUID {.bycopy.} = object
LowPart: uint32
HighPart: int32
SECPKG_CLIENT_INFO_EX {.bycopy.} = object
LogonId: LUID
ProcessID: uint32
ThreadID: uint32
HasTcbPrivilege: uint8
Impersonating: uint8
Restricted: uint8
ClientFlags: uint8
ImpersonationLevel: int32
ClientToken: pointer
IdentificationLogonId: LUID
IdentificationToken: pointerstruct LUID
{
uint LowPart;
int HighPart;
}
struct SECPKG_CLIENT_INFO_EX
{
LUID LogonId;
uint ProcessID;
uint ThreadID;
ubyte HasTcbPrivilege;
ubyte Impersonating;
ubyte Restricted;
ubyte ClientFlags;
int ImpersonationLevel;
void* ClientToken;
LUID IdentificationLogonId;
void* IdentificationToken;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SECPKG_CLIENT_INFO_EX サイズ: 40 バイト(x86)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; LogonId : LUID (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; ProcessID : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ThreadID : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; HasTcbPrivilege : BOOLEAN (+16, 1byte) poke st,16,値 / 値 = peek(st,16)
; Impersonating : BOOLEAN (+17, 1byte) poke st,17,値 / 値 = peek(st,17)
; Restricted : BOOLEAN (+18, 1byte) poke st,18,値 / 値 = peek(st,18)
; ClientFlags : BYTE (+19, 1byte) poke st,19,値 / 値 = peek(st,19)
; ImpersonationLevel : SECURITY_IMPERSONATION_LEVEL (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; ClientToken : HANDLE (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; IdentificationLogonId : LUID (+28, 8byte) varptr(st)+28 を基点に操作(8byte:入れ子/配列)
; IdentificationToken : HANDLE (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SECPKG_CLIENT_INFO_EX サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; LogonId : LUID (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; ProcessID : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ThreadID : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; HasTcbPrivilege : BOOLEAN (+16, 1byte) poke st,16,値 / 値 = peek(st,16)
; Impersonating : BOOLEAN (+17, 1byte) poke st,17,値 / 値 = peek(st,17)
; Restricted : BOOLEAN (+18, 1byte) poke st,18,値 / 値 = peek(st,18)
; ClientFlags : BYTE (+19, 1byte) poke st,19,値 / 値 = peek(st,19)
; ImpersonationLevel : SECURITY_IMPERSONATION_LEVEL (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; ClientToken : HANDLE (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; IdentificationLogonId : LUID (+32, 8byte) varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; IdentificationToken : HANDLE (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global LUID
#field int LowPart
#field int HighPart
#endstruct
#defstruct global SECPKG_CLIENT_INFO_EX
#field LUID LogonId
#field int ProcessID
#field int ThreadID
#field bool1 HasTcbPrivilege
#field bool1 Impersonating
#field bool1 Restricted
#field byte ClientFlags
#field int ImpersonationLevel
#field intptr ClientToken
#field LUID IdentificationLogonId
#field intptr IdentificationToken
#endstruct
stdim st, SECPKG_CLIENT_INFO_EX ; NSTRUCT 変数を確保
st->ProcessID = 100
mes "ProcessID=" + st->ProcessID