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

SECPKG_CLIENT_INFO_EX

構造体
サイズx64: 48 バイト / x86: 40 バイト

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

フィールド

フィールドサイズx64x86説明
LogonIdLUID8+0+0クライアントのログオンセッションを識別するLUID。
ProcessIDDWORD4+8+8クライアントプロセスのID。
ThreadIDDWORD4+12+12呼び出しを行ったクライアントスレッドのID。
HasTcbPrivilegeBOOLEAN1+16+16クライアントがTCB特権を持つかを示す真偽値。
ImpersonatingBOOLEAN1+17+17クライアントが他者になりすまし中かを示す真偽値。
RestrictedBOOLEAN1+18+18クライアントトークンが制限付きかを示す真偽値。
ClientFlagsBYTE1+19+19クライアントの状態を示すビットフラグ。
ImpersonationLevelSECURITY_IMPERSONATION_LEVEL4+20+20クライアントの偽装レベルを示すSECURITY_IMPERSONATION_LEVEL列挙値。
ClientTokenHANDLE8/4+24+24クライアントのアクセストークンを参照するハンドル。
IdentificationLogonIdLUID8+32+28識別用に用いるログオンセッションを識別するLUID。
IdentificationTokenHANDLE8/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 Structure
import 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: pointer
struct 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