ホーム › Security.Authentication.Identity › CENTRAL_ACCESS_POLICY_ENTRY
CENTRAL_ACCESS_POLICY_ENTRY
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Name | LSA_UNICODE_STRING | 16/8 | +0 | +0 | 中央アクセスポリシー規則の名前(LSA_UNICODE_STRING)。 |
| Description | LSA_UNICODE_STRING | 16/8 | +16 | +8 | 規則の説明文(LSA_UNICODE_STRING)。 |
| ChangeId | LSA_UNICODE_STRING | 16/8 | +32 | +16 | 規則の変更を追跡する識別子(LSA_UNICODE_STRING)。 |
| LengthAppliesTo | DWORD | 4 | +48 | +24 | AppliesToのバイト長。 |
| AppliesTo | BYTE* | 8/4 | +56 | +28 | 規則が適用される条件式(SDDL/ACE形式)の生データ。 |
| LengthSD | DWORD | 4 | +64 | +32 | SDのバイト長。 |
| SD | PSECURITY_DESCRIPTOR | 8/4 | +72 | +36 | 規則の現行セキュリティ記述子。 |
| LengthStagedSD | DWORD | 4 | +80 | +40 | StagedSDのバイト長。 |
| StagedSD | PSECURITY_DESCRIPTOR | 8/4 | +88 | +44 | ステージング(試験運用)用のセキュリティ記述子。NULL可。 |
| Flags | DWORD | 4 | +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 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 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: uint32struct 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