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

CENTRAL_ACCESS_POLICY_ENTRY

構造体
サイズx64: 104 バイト / x86: 52 バイト

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

フィールド

フィールドサイズx64x86説明
NameLSA_UNICODE_STRING16/8+0+0中央アクセスポリシー規則の名前(LSA_UNICODE_STRING)。
DescriptionLSA_UNICODE_STRING16/8+16+8規則の説明文(LSA_UNICODE_STRING)。
ChangeIdLSA_UNICODE_STRING16/8+32+16規則の変更を追跡する識別子(LSA_UNICODE_STRING)。
LengthAppliesToDWORD4+48+24AppliesToのバイト長。
AppliesToBYTE*8/4+56+28規則が適用される条件式(SDDL/ACE形式)の生データ。
LengthSDDWORD4+64+32SDのバイト長。
SDPSECURITY_DESCRIPTOR8/4+72+36規則の現行セキュリティ記述子。
LengthStagedSDDWORD4+80+40StagedSDのバイト長。
StagedSDPSECURITY_DESCRIPTOR8/4+88+44ステージング(試験運用)用のセキュリティ記述子。NULL可。
FlagsDWORD4+96+48規則に関するフラグ。

各言語での定義

#include <windows.h>

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

// CENTRAL_ACCESS_POLICY_ENTRY  (x64 104 / x86 52 バイト)
typedef struct CENTRAL_ACCESS_POLICY_ENTRY {
    LSA_UNICODE_STRING Name;
    LSA_UNICODE_STRING Description;
    LSA_UNICODE_STRING ChangeId;
    DWORD LengthAppliesTo;
    BYTE* AppliesTo;
    DWORD LengthSD;
    PSECURITY_DESCRIPTOR SD;
    DWORD LengthStagedSD;
    PSECURITY_DESCRIPTOR StagedSD;
    DWORD Flags;
} CENTRAL_ACCESS_POLICY_ENTRY;
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 CENTRAL_ACCESS_POLICY_ENTRY
{
    public LSA_UNICODE_STRING Name;
    public LSA_UNICODE_STRING Description;
    public LSA_UNICODE_STRING ChangeId;
    public uint LengthAppliesTo;
    public IntPtr AppliesTo;
    public uint LengthSD;
    public IntPtr SD;
    public uint LengthStagedSD;
    public IntPtr StagedSD;
    public uint Flags;
}
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 CENTRAL_ACCESS_POLICY_ENTRY
    Public Name As LSA_UNICODE_STRING
    Public Description As LSA_UNICODE_STRING
    Public ChangeId As LSA_UNICODE_STRING
    Public LengthAppliesTo As UInteger
    Public AppliesTo As IntPtr
    Public LengthSD As UInteger
    Public SD As IntPtr
    Public LengthStagedSD As UInteger
    Public StagedSD As IntPtr
    Public Flags 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 CENTRAL_ACCESS_POLICY_ENTRY(ctypes.Structure):
    _fields_ = [
        ("Name", LSA_UNICODE_STRING),
        ("Description", LSA_UNICODE_STRING),
        ("ChangeId", LSA_UNICODE_STRING),
        ("LengthAppliesTo", wintypes.DWORD),
        ("AppliesTo", ctypes.c_void_p),
        ("LengthSD", wintypes.DWORD),
        ("SD", ctypes.c_void_p),
        ("LengthStagedSD", wintypes.DWORD),
        ("StagedSD", ctypes.c_void_p),
        ("Flags", 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 CENTRAL_ACCESS_POLICY_ENTRY {
    pub Name: LSA_UNICODE_STRING,
    pub Description: LSA_UNICODE_STRING,
    pub ChangeId: LSA_UNICODE_STRING,
    pub LengthAppliesTo: u32,
    pub AppliesTo: *mut core::ffi::c_void,
    pub LengthSD: u32,
    pub SD: *mut core::ffi::c_void,
    pub LengthStagedSD: u32,
    pub StagedSD: *mut core::ffi::c_void,
    pub Flags: u32,
}
import "golang.org/x/sys/windows"

type LSA_UNICODE_STRING struct {
	Length uint16
	MaximumLength uint16
	Buffer uintptr
}

type CENTRAL_ACCESS_POLICY_ENTRY struct {
	Name LSA_UNICODE_STRING
	Description LSA_UNICODE_STRING
	ChangeId LSA_UNICODE_STRING
	LengthAppliesTo uint32
	AppliesTo uintptr
	LengthSD uint32
	SD uintptr
	LengthStagedSD uint32
	StagedSD uintptr
	Flags uint32
}
type
  LSA_UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  CENTRAL_ACCESS_POLICY_ENTRY = record
    Name: LSA_UNICODE_STRING;
    Description: LSA_UNICODE_STRING;
    ChangeId: LSA_UNICODE_STRING;
    LengthAppliesTo: DWORD;
    AppliesTo: Pointer;
    LengthSD: DWORD;
    SD: Pointer;
    LengthStagedSD: DWORD;
    StagedSD: Pointer;
    Flags: DWORD;
  end;
const LSA_UNICODE_STRING = extern struct {
    Length: u16,
    MaximumLength: u16,
    Buffer: ?*anyopaque,
};

const CENTRAL_ACCESS_POLICY_ENTRY = extern struct {
    Name: LSA_UNICODE_STRING,
    Description: LSA_UNICODE_STRING,
    ChangeId: LSA_UNICODE_STRING,
    LengthAppliesTo: u32,
    AppliesTo: ?*anyopaque,
    LengthSD: u32,
    SD: ?*anyopaque,
    LengthStagedSD: u32,
    StagedSD: ?*anyopaque,
    Flags: u32,
};
type
  LSA_UNICODE_STRING {.bycopy.} = object
    Length: uint16
    MaximumLength: uint16
    Buffer: pointer

  CENTRAL_ACCESS_POLICY_ENTRY {.bycopy.} = object
    Name: LSA_UNICODE_STRING
    Description: LSA_UNICODE_STRING
    ChangeId: LSA_UNICODE_STRING
    LengthAppliesTo: uint32
    AppliesTo: pointer
    LengthSD: uint32
    SD: pointer
    LengthStagedSD: uint32
    StagedSD: pointer
    Flags: uint32
struct LSA_UNICODE_STRING
{
    ushort Length;
    ushort MaximumLength;
    void* Buffer;
}

struct CENTRAL_ACCESS_POLICY_ENTRY
{
    LSA_UNICODE_STRING Name;
    LSA_UNICODE_STRING Description;
    LSA_UNICODE_STRING ChangeId;
    uint LengthAppliesTo;
    void* AppliesTo;
    uint LengthSD;
    void* SD;
    uint LengthStagedSD;
    void* StagedSD;
    uint Flags;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CENTRAL_ACCESS_POLICY_ENTRY サイズ: 52 バイト(x86)
dim st, 13    ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; Name : LSA_UNICODE_STRING (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Description : LSA_UNICODE_STRING (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; ChangeId : LSA_UNICODE_STRING (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; LengthAppliesTo : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; AppliesTo : BYTE* (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; LengthSD : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; SD : PSECURITY_DESCRIPTOR (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; LengthStagedSD : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; StagedSD : PSECURITY_DESCRIPTOR (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; Flags : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CENTRAL_ACCESS_POLICY_ENTRY サイズ: 104 バイト(x64)
dim st, 26    ; 4byte整数×26(構造体サイズ 104 / 4 切り上げ)
; Name : LSA_UNICODE_STRING (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; Description : LSA_UNICODE_STRING (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; ChangeId : LSA_UNICODE_STRING (+32, 16byte)  varptr(st)+32 を基点に操作(16byte:入れ子/配列)
; LengthAppliesTo : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; AppliesTo : BYTE* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; LengthSD : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; SD : PSECURITY_DESCRIPTOR (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; LengthStagedSD : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; StagedSD : PSECURITY_DESCRIPTOR (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; Flags : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (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 CENTRAL_ACCESS_POLICY_ENTRY
    #field LSA_UNICODE_STRING Name
    #field LSA_UNICODE_STRING Description
    #field LSA_UNICODE_STRING ChangeId
    #field int LengthAppliesTo
    #field intptr AppliesTo
    #field int LengthSD
    #field intptr SD
    #field int LengthStagedSD
    #field intptr StagedSD
    #field int Flags
#endstruct

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