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

SECPKG_PRIMARY_CRED_EX

構造体
サイズx64: 224 バイト / x86: 120 バイト

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

フィールド

フィールドサイズx64x86説明
LogonIdLUID8+0+0資格情報が属するログオンセッションを識別するLUID。
DownlevelNameLSA_UNICODE_STRING16/8+8+8ダウンレベル(NetBIOS)形式のユーザー名を保持するUnicode文字列。
DomainNameLSA_UNICODE_STRING16/8+24+16ユーザーが属するドメイン名を保持するUnicode文字列。
PasswordLSA_UNICODE_STRING16/8+40+24現在の平文パスワードを保持するUnicode文字列。
OldPasswordLSA_UNICODE_STRING16/8+56+32変更前の旧パスワードを保持するUnicode文字列。
UserSidPSID8/4+72+40ユーザーのSID。
FlagsDWORD4+80+44プライマリ資格情報の特性を示すビットフラグ。
DnsDomainNameLSA_UNICODE_STRING16/8+88+48DNS形式のドメイン名を保持するUnicode文字列。
UpnLSA_UNICODE_STRING16/8+104+56ユーザープリンシパル名(UPN)を保持するUnicode文字列。
LogonServerLSA_UNICODE_STRING16/8+120+64認証を行ったログオンサーバー名を保持するUnicode文字列。
Spare1LSA_UNICODE_STRING16/8+136+72将来利用のための予約Unicode文字列。
Spare2LSA_UNICODE_STRING16/8+152+80将来利用のための予約Unicode文字列。
Spare3LSA_UNICODE_STRING16/8+168+88将来利用のための予約Unicode文字列。
Spare4LSA_UNICODE_STRING16/8+184+96将来利用のための予約Unicode文字列。
PackageIdUINT_PTR8/4+200+104資格情報を所有するセキュリティパッケージの識別子。
PrevLogonIdLUID8+208+108直前のログオンセッションを識別するLUID。
FlagsExDWORD4+216+116拡張版の追加特性を示すビットフラグ。

各言語での定義

#include <windows.h>

// LUID  (x64 8 / x86 8 バイト)
typedef struct LUID {
    DWORD LowPart;
    INT HighPart;
} LUID;

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

// SECPKG_PRIMARY_CRED_EX  (x64 224 / x86 120 バイト)
typedef struct SECPKG_PRIMARY_CRED_EX {
    LUID LogonId;
    LSA_UNICODE_STRING DownlevelName;
    LSA_UNICODE_STRING DomainName;
    LSA_UNICODE_STRING Password;
    LSA_UNICODE_STRING OldPassword;
    PSID UserSid;
    DWORD Flags;
    LSA_UNICODE_STRING DnsDomainName;
    LSA_UNICODE_STRING Upn;
    LSA_UNICODE_STRING LogonServer;
    LSA_UNICODE_STRING Spare1;
    LSA_UNICODE_STRING Spare2;
    LSA_UNICODE_STRING Spare3;
    LSA_UNICODE_STRING Spare4;
    UINT_PTR PackageId;
    LUID PrevLogonId;
    DWORD FlagsEx;
} SECPKG_PRIMARY_CRED_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 LSA_UNICODE_STRING
{
    public ushort Length;
    public ushort MaximumLength;
    public IntPtr Buffer;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SECPKG_PRIMARY_CRED_EX
{
    public LUID LogonId;
    public LSA_UNICODE_STRING DownlevelName;
    public LSA_UNICODE_STRING DomainName;
    public LSA_UNICODE_STRING Password;
    public LSA_UNICODE_STRING OldPassword;
    public IntPtr UserSid;
    public uint Flags;
    public LSA_UNICODE_STRING DnsDomainName;
    public LSA_UNICODE_STRING Upn;
    public LSA_UNICODE_STRING LogonServer;
    public LSA_UNICODE_STRING Spare1;
    public LSA_UNICODE_STRING Spare2;
    public LSA_UNICODE_STRING Spare3;
    public LSA_UNICODE_STRING Spare4;
    public UIntPtr PackageId;
    public LUID PrevLogonId;
    public uint FlagsEx;
}
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 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 SECPKG_PRIMARY_CRED_EX
    Public LogonId As LUID
    Public DownlevelName As LSA_UNICODE_STRING
    Public DomainName As LSA_UNICODE_STRING
    Public Password As LSA_UNICODE_STRING
    Public OldPassword As LSA_UNICODE_STRING
    Public UserSid As IntPtr
    Public Flags As UInteger
    Public DnsDomainName As LSA_UNICODE_STRING
    Public Upn As LSA_UNICODE_STRING
    Public LogonServer As LSA_UNICODE_STRING
    Public Spare1 As LSA_UNICODE_STRING
    Public Spare2 As LSA_UNICODE_STRING
    Public Spare3 As LSA_UNICODE_STRING
    Public Spare4 As LSA_UNICODE_STRING
    Public PackageId As UIntPtr
    Public PrevLogonId As LUID
    Public FlagsEx As UInteger
End Structure
import ctypes
from ctypes import wintypes

class LUID(ctypes.Structure):
    _fields_ = [
        ("LowPart", wintypes.DWORD),
        ("HighPart", ctypes.c_int),
    ]

class LSA_UNICODE_STRING(ctypes.Structure):
    _fields_ = [
        ("Length", ctypes.c_ushort),
        ("MaximumLength", ctypes.c_ushort),
        ("Buffer", ctypes.c_void_p),
    ]

class SECPKG_PRIMARY_CRED_EX(ctypes.Structure):
    _fields_ = [
        ("LogonId", LUID),
        ("DownlevelName", LSA_UNICODE_STRING),
        ("DomainName", LSA_UNICODE_STRING),
        ("Password", LSA_UNICODE_STRING),
        ("OldPassword", LSA_UNICODE_STRING),
        ("UserSid", ctypes.c_void_p),
        ("Flags", wintypes.DWORD),
        ("DnsDomainName", LSA_UNICODE_STRING),
        ("Upn", LSA_UNICODE_STRING),
        ("LogonServer", LSA_UNICODE_STRING),
        ("Spare1", LSA_UNICODE_STRING),
        ("Spare2", LSA_UNICODE_STRING),
        ("Spare3", LSA_UNICODE_STRING),
        ("Spare4", LSA_UNICODE_STRING),
        ("PackageId", ctypes.c_size_t),
        ("PrevLogonId", LUID),
        ("FlagsEx", wintypes.DWORD),
    ]
#[repr(C)]
pub struct LUID {
    pub LowPart: u32,
    pub HighPart: i32,
}

#[repr(C)]
pub struct LSA_UNICODE_STRING {
    pub Length: u16,
    pub MaximumLength: u16,
    pub Buffer: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct SECPKG_PRIMARY_CRED_EX {
    pub LogonId: LUID,
    pub DownlevelName: LSA_UNICODE_STRING,
    pub DomainName: LSA_UNICODE_STRING,
    pub Password: LSA_UNICODE_STRING,
    pub OldPassword: LSA_UNICODE_STRING,
    pub UserSid: *mut core::ffi::c_void,
    pub Flags: u32,
    pub DnsDomainName: LSA_UNICODE_STRING,
    pub Upn: LSA_UNICODE_STRING,
    pub LogonServer: LSA_UNICODE_STRING,
    pub Spare1: LSA_UNICODE_STRING,
    pub Spare2: LSA_UNICODE_STRING,
    pub Spare3: LSA_UNICODE_STRING,
    pub Spare4: LSA_UNICODE_STRING,
    pub PackageId: usize,
    pub PrevLogonId: LUID,
    pub FlagsEx: u32,
}
import "golang.org/x/sys/windows"

type LUID struct {
	LowPart uint32
	HighPart int32
}

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type SECPKG_PRIMARY_CRED_EX struct {
	LogonId LUID
	DownlevelName LSA_UNICODE_STRING
	DomainName LSA_UNICODE_STRING
	Password LSA_UNICODE_STRING
	OldPassword LSA_UNICODE_STRING
	UserSid uintptr
	Flags uint32
	DnsDomainName LSA_UNICODE_STRING
	Upn LSA_UNICODE_STRING
	LogonServer LSA_UNICODE_STRING
	Spare1 LSA_UNICODE_STRING
	Spare2 LSA_UNICODE_STRING
	Spare3 LSA_UNICODE_STRING
	Spare4 LSA_UNICODE_STRING
	PackageId uintptr
	PrevLogonId LUID
	FlagsEx uint32
}
type
  LUID = record
    LowPart: DWORD;
    HighPart: Integer;
  end;

  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  SECPKG_PRIMARY_CRED_EX = record
    LogonId: LUID;
    DownlevelName: LSA_UNICODE_STRING;
    DomainName: LSA_UNICODE_STRING;
    Password: LSA_UNICODE_STRING;
    OldPassword: LSA_UNICODE_STRING;
    UserSid: Pointer;
    Flags: DWORD;
    DnsDomainName: LSA_UNICODE_STRING;
    Upn: LSA_UNICODE_STRING;
    LogonServer: LSA_UNICODE_STRING;
    Spare1: LSA_UNICODE_STRING;
    Spare2: LSA_UNICODE_STRING;
    Spare3: LSA_UNICODE_STRING;
    Spare4: LSA_UNICODE_STRING;
    PackageId: NativeUInt;
    PrevLogonId: LUID;
    FlagsEx: DWORD;
  end;
const LUID = extern struct {
    LowPart: u32,
    HighPart: i32,
};

const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const SECPKG_PRIMARY_CRED_EX = extern struct {
    LogonId: LUID,
    DownlevelName: LSA_UNICODE_STRING,
    DomainName: LSA_UNICODE_STRING,
    Password: LSA_UNICODE_STRING,
    OldPassword: LSA_UNICODE_STRING,
    UserSid: ?*anyopaque,
    Flags: u32,
    DnsDomainName: LSA_UNICODE_STRING,
    Upn: LSA_UNICODE_STRING,
    LogonServer: LSA_UNICODE_STRING,
    Spare1: LSA_UNICODE_STRING,
    Spare2: LSA_UNICODE_STRING,
    Spare3: LSA_UNICODE_STRING,
    Spare4: LSA_UNICODE_STRING,
    PackageId: usize,
    PrevLogonId: LUID,
    FlagsEx: u32,
};
type
  LUID {.bycopy.} = object
    LowPart: uint32
    HighPart: int32

  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  SECPKG_PRIMARY_CRED_EX {.bycopy.} = object
    LogonId: LUID
    DownlevelName: LSA_UNICODE_STRING
    DomainName: LSA_UNICODE_STRING
    Password: LSA_UNICODE_STRING
    OldPassword: LSA_UNICODE_STRING
    UserSid: pointer
    Flags: uint32
    DnsDomainName: LSA_UNICODE_STRING
    Upn: LSA_UNICODE_STRING
    LogonServer: LSA_UNICODE_STRING
    Spare1: LSA_UNICODE_STRING
    Spare2: LSA_UNICODE_STRING
    Spare3: LSA_UNICODE_STRING
    Spare4: LSA_UNICODE_STRING
    PackageId: uint
    PrevLogonId: LUID
    FlagsEx: uint32
struct LUID
{
    uint LowPart;
    int HighPart;
}

struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct SECPKG_PRIMARY_CRED_EX
{
    LUID LogonId;
    LSA_UNICODE_STRING DownlevelName;
    LSA_UNICODE_STRING DomainName;
    LSA_UNICODE_STRING Password;
    LSA_UNICODE_STRING OldPassword;
    void* UserSid;
    uint Flags;
    LSA_UNICODE_STRING DnsDomainName;
    LSA_UNICODE_STRING Upn;
    LSA_UNICODE_STRING LogonServer;
    LSA_UNICODE_STRING Spare1;
    LSA_UNICODE_STRING Spare2;
    LSA_UNICODE_STRING Spare3;
    LSA_UNICODE_STRING Spare4;
    size_t PackageId;
    LUID PrevLogonId;
    uint FlagsEx;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SECPKG_PRIMARY_CRED_EX サイズ: 120 バイト(x86)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; LogonId : LUID (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; DownlevelName : LSA_UNICODE_STRING (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; Password : LSA_UNICODE_STRING (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; OldPassword : LSA_UNICODE_STRING (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; UserSid : PSID (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Flags : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; DnsDomainName : LSA_UNICODE_STRING (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; Upn : LSA_UNICODE_STRING (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; LogonServer : LSA_UNICODE_STRING (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; Spare1 : LSA_UNICODE_STRING (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; Spare2 : LSA_UNICODE_STRING (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; Spare3 : LSA_UNICODE_STRING (+88, 8byte)  varptr(st)+88 を基点に操作(8byte:入れ子/配列)
; Spare4 : LSA_UNICODE_STRING (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; PackageId : UINT_PTR (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; PrevLogonId : LUID (+108, 8byte)  varptr(st)+108 を基点に操作(8byte:入れ子/配列)
; FlagsEx : DWORD (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SECPKG_PRIMARY_CRED_EX サイズ: 224 バイト(x64)
dim st, 56    ; 4byte整数×56(構造体サイズ 224 / 4 切り上げ)
; LogonId : LUID (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; DownlevelName : LSA_UNICODE_STRING (+8, 16byte)  varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; DomainName : LSA_UNICODE_STRING (+24, 16byte)  varptr(st)+24 を基点に操作(16byte:入れ子/配列)
; Password : LSA_UNICODE_STRING (+40, 16byte)  varptr(st)+40 を基点に操作(16byte:入れ子/配列)
; OldPassword : LSA_UNICODE_STRING (+56, 16byte)  varptr(st)+56 を基点に操作(16byte:入れ子/配列)
; UserSid : PSID (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; Flags : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; DnsDomainName : LSA_UNICODE_STRING (+88, 16byte)  varptr(st)+88 を基点に操作(16byte:入れ子/配列)
; Upn : LSA_UNICODE_STRING (+104, 16byte)  varptr(st)+104 を基点に操作(16byte:入れ子/配列)
; LogonServer : LSA_UNICODE_STRING (+120, 16byte)  varptr(st)+120 を基点に操作(16byte:入れ子/配列)
; Spare1 : LSA_UNICODE_STRING (+136, 16byte)  varptr(st)+136 を基点に操作(16byte:入れ子/配列)
; Spare2 : LSA_UNICODE_STRING (+152, 16byte)  varptr(st)+152 を基点に操作(16byte:入れ子/配列)
; Spare3 : LSA_UNICODE_STRING (+168, 16byte)  varptr(st)+168 を基点に操作(16byte:入れ子/配列)
; Spare4 : LSA_UNICODE_STRING (+184, 16byte)  varptr(st)+184 を基点に操作(16byte:入れ子/配列)
; PackageId : UINT_PTR (+200, 8byte)  qpoke st,200,値 / qpeek(st,200)  ※IronHSPのみ。3.7/3.8は lpoke st,200,下位 : lpoke st,204,上位
; PrevLogonId : LUID (+208, 8byte)  varptr(st)+208 を基点に操作(8byte:入れ子/配列)
; FlagsEx : DWORD (+216, 4byte)  st.54 = 値  /  値 = st.54   (lpoke/lpeek も可)
; ※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 LSA_UNICODE_STRING
    #field short Length
    #field short MaximumLength
    #field intptr Buffer
#endstruct

#defstruct global SECPKG_PRIMARY_CRED_EX
    #field LUID LogonId
    #field LSA_UNICODE_STRING DownlevelName
    #field LSA_UNICODE_STRING DomainName
    #field LSA_UNICODE_STRING Password
    #field LSA_UNICODE_STRING OldPassword
    #field intptr UserSid
    #field int Flags
    #field LSA_UNICODE_STRING DnsDomainName
    #field LSA_UNICODE_STRING Upn
    #field LSA_UNICODE_STRING LogonServer
    #field LSA_UNICODE_STRING Spare1
    #field LSA_UNICODE_STRING Spare2
    #field LSA_UNICODE_STRING Spare3
    #field LSA_UNICODE_STRING Spare4
    #field intptr PackageId
    #field LUID PrevLogonId
    #field int FlagsEx
#endstruct

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