Win32 API 日本語リファレンス
ホームSecurity › ACCESS_ALLOWED_CALLBACK_OBJECT_ACE

ACCESS_ALLOWED_CALLBACK_OBJECT_ACE

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

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

フィールド

フィールドサイズx64x86説明
HeaderACE_HEADER4+0+0ACE のサイズと種類を指定する ACE_HEADER 構造体です。また、子オブジェクトによる ACE の継承を制御するフラグも含まれます。ACE_HEADER 構造体の AceType メンバーには ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE を設定し、AceSize メンバーには ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体に割り当てられた合計バイト数を設定します。
MaskDWORD4+4+4システムが トラスティ に許可するアクセス権を指定する ACCESS_MASK です。
FlagsSYSTEM_AUDIT_OBJECT_ACE_FLAGS4+8+8

ObjectType メンバーと InheritedObjectType メンバーが存在するかどうかを示すビットフラグのセットです。このパラメーターには、次の値のうち 1 つ以上を指定できます。

意味
0
ObjectTypeInheritedObjectType のいずれも存在しません。SidStart メンバーが Flags メンバーの直後に続きます。
ACE_OBJECT_TYPE_PRESENT
ObjectType が存在し、GUID を格納しています。

この値が指定されていない場合、InheritedObjectType メンバーが Flags メンバーの直後に続きます。

ACE_INHERITED_OBJECT_TYPE_PRESENT
InheritedObjectType が存在し、GUID を格納しています。

この値が指定されていない場合、すべての種類の子オブジェクトが ACE を継承できます。

ObjectTypeGUID16+12+12

このメンバーは、Flags メンバーで ACE_OBJECT_TYPE_PRESENT ビットが設定されている場合にのみ存在します。設定されていない場合は、InheritedObjectType メンバーが Flags メンバーの直後に続きます。

このメンバーが存在する場合、それはプロパティセット、プロパティ、拡張権利、または子オブジェクトの種類を識別する GUID 構造体です。この GUID の用途は、Mask メンバーで指定されたアクセス権によって異なります。

意味
ADS_RIGHT_DS_CONTROL_ACCESS
ObjectTypeGUID は拡張アクセス権を識別します。
ADS_RIGHT_DS_CREATE_CHILD
ObjectTypeGUID は子オブジェクトの種類を識別します。この ACE は、この種類の子オブジェクトを作成するトラスティの権利を制御します。
ADS_RIGHT_DS_READ_PROP
ObjectTypeGUID は、オブジェクトのプロパティセットまたはプロパティを識別します。この ACE は、そのプロパティまたはプロパティセットを読み取るトラスティの権利を制御します。
ADS_RIGHT_DS_WRITE_PROP
ObjectTypeGUID は、オブジェクトのプロパティセットまたはプロパティを識別します。この ACE は、そのプロパティまたはプロパティセットに書き込むトラスティの権利を制御します。
ADS_RIGHT_DS_SELF
ObjectTypeGUID は検証付き書き込みを識別します。
InheritedObjectTypeGUID16+28+28

このメンバーは、Flags メンバーで ACE_INHERITED_OBJECT_TYPE_PRESENT ビットが設定されている場合にのみ存在します。

このメンバーが存在する場合、それは ACE を継承できる子オブジェクトの種類を識別する GUID 構造体です。継承は、 ACE_HEADER 内の継承フラグ、および子オブジェクトに設定された継承の保護によっても制御されます。

このメンバーのオフセットは変化します。Flags メンバーに ACE_OBJECT_TYPE_PRESENT フラグが含まれていない場合、InheritedObjectType メンバーは ObjectType メンバーで指定されたオフセットから始まります。

SidStartDWORD4+44+44トラスティの SID の最初の DWORD です。SID の残りのバイトは、SidStart メンバーの後の連続したメモリに格納されます。この SID にはアプリケーションデータを付加できます。

公式ドキュメント

ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体は、オブジェクト、プロパティセット、またはプロパティへの許可されたアクセスを制御する アクセス制御エントリ (ACE) を定義します。この ACE には、一連のアクセス権、オブジェクトの種類を識別する GUID、およびシステムがアクセスを許可する トラスティ を識別する セキュリティ識別子 (SID) が含まれます。また、この ACE には、子オブジェクトによる ACE の継承を制御する GUID と一連のフラグも含まれます。

AuthzAccessCheck 関数が呼び出されると、AuthzAccessCheck 関数にポインターで渡された SECURITY_DESCRIPTOR 構造体の DACL に含まれる各 ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体が、アプリケーション定義の AuthzAccessCheckCallback 関数の呼び出しを発生させます。その呼び出しでは、見つかった ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体へのポインターが pAce パラメーターに渡されます。

解説(Remarks)

ObjectTypeInheritedObjectType のどちらの GUID も指定されていない場合、ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体は ACCESS_ALLOWED_CALLBACK_ACE 構造体と同じ意味を持ちます。その場合は、より小さく効率的な ACCESS_ALLOWED_CALLBACK_ACE 構造体を使用してください。

ACCESS_ALLOWED_CALLBACK_OBJECT_ACE を含む ACL は、その ACL ヘッダーで ACL_REVISION_DS リビジョン番号を指定する必要があります。

Mask メンバーで指定されたアクセス権は、SidStart メンバーに格納されている SID と一致する有効な SID を持つ トラスティ に許可されます。

ACCESS_ALLOWED_CALLBACK_OBJECT_ACE 構造体を作成する際には、ObjectType メンバーと InheritedObjectType メンバーのいずれかまたは両方が存在する場合はそれらの GUID 構造体を格納できるだけのメモリと、SidStart メンバーおよびそれに続く連続したメモリにトラスティの完全な SID を格納できるだけのメモリを割り当てる必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// ACE_HEADER  (x64 4 / x86 4 バイト)
typedef struct ACE_HEADER {
    BYTE AceType;
    BYTE AceFlags;
    WORD AceSize;
} ACE_HEADER;

// ACCESS_ALLOWED_CALLBACK_OBJECT_ACE  (x64 48 / x86 48 バイト)
typedef struct ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
    ACE_HEADER Header;
    DWORD Mask;
    SYSTEM_AUDIT_OBJECT_ACE_FLAGS Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ACE_HEADER
{
    public byte AceType;
    public byte AceFlags;
    public ushort AceSize;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ACCESS_ALLOWED_CALLBACK_OBJECT_ACE
{
    public ACE_HEADER Header;
    public uint Mask;
    public uint Flags;
    public Guid ObjectType;
    public Guid InheritedObjectType;
    public uint SidStart;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ACE_HEADER
    Public AceType As Byte
    Public AceFlags As Byte
    Public AceSize As UShort
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ACCESS_ALLOWED_CALLBACK_OBJECT_ACE
    Public Header As ACE_HEADER
    Public Mask As UInteger
    Public Flags As UInteger
    Public ObjectType As Guid
    Public InheritedObjectType As Guid
    Public SidStart As UInteger
End Structure
import ctypes
from ctypes import wintypes

class ACE_HEADER(ctypes.Structure):
    _fields_ = [
        ("AceType", ctypes.c_ubyte),
        ("AceFlags", ctypes.c_ubyte),
        ("AceSize", ctypes.c_ushort),
    ]

class ACCESS_ALLOWED_CALLBACK_OBJECT_ACE(ctypes.Structure):
    _fields_ = [
        ("Header", ACE_HEADER),
        ("Mask", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("ObjectType", GUID),
        ("InheritedObjectType", GUID),
        ("SidStart", wintypes.DWORD),
    ]
#[repr(C)]
pub struct ACE_HEADER {
    pub AceType: u8,
    pub AceFlags: u8,
    pub AceSize: u16,
}

#[repr(C)]
pub struct ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
    pub Header: ACE_HEADER,
    pub Mask: u32,
    pub Flags: u32,
    pub ObjectType: GUID,
    pub InheritedObjectType: GUID,
    pub SidStart: u32,
}
import "golang.org/x/sys/windows"

type ACE_HEADER struct {
	AceType byte
	AceFlags byte
	AceSize uint16
}

type ACCESS_ALLOWED_CALLBACK_OBJECT_ACE struct {
	Header ACE_HEADER
	Mask uint32
	Flags uint32
	ObjectType windows.GUID
	InheritedObjectType windows.GUID
	SidStart uint32
}
type
  ACE_HEADER = record
    AceType: Byte;
    AceFlags: Byte;
    AceSize: Word;
  end;

  ACCESS_ALLOWED_CALLBACK_OBJECT_ACE = record
    Header: ACE_HEADER;
    Mask: DWORD;
    Flags: DWORD;
    ObjectType: TGUID;
    InheritedObjectType: TGUID;
    SidStart: DWORD;
  end;
const ACE_HEADER = extern struct {
    AceType: u8,
    AceFlags: u8,
    AceSize: u16,
};

const ACCESS_ALLOWED_CALLBACK_OBJECT_ACE = extern struct {
    Header: ACE_HEADER,
    Mask: u32,
    Flags: u32,
    ObjectType: GUID,
    InheritedObjectType: GUID,
    SidStart: u32,
};
type
  ACE_HEADER {.bycopy.} = object
    AceType: uint8
    AceFlags: uint8
    AceSize: uint16

  ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {.bycopy.} = object
    Header: ACE_HEADER
    Mask: uint32
    Flags: uint32
    ObjectType: GUID
    InheritedObjectType: GUID
    SidStart: uint32
struct ACE_HEADER
{
    ubyte AceType;
    ubyte AceFlags;
    ushort AceSize;
}

struct ACCESS_ALLOWED_CALLBACK_OBJECT_ACE
{
    ACE_HEADER Header;
    uint Mask;
    uint Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    uint SidStart;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ACCESS_ALLOWED_CALLBACK_OBJECT_ACE サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Header : ACE_HEADER (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; Mask : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Flags : SYSTEM_AUDIT_OBJECT_ACE_FLAGS (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ObjectType : GUID (+12, 16byte)  varptr(st)+12 を基点に操作(16byte:入れ子/配列)
; InheritedObjectType : GUID (+28, 16byte)  varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; SidStart : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global ACE_HEADER
    #field byte AceType
    #field byte AceFlags
    #field short AceSize
#endstruct

#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global ACCESS_ALLOWED_CALLBACK_OBJECT_ACE
    #field ACE_HEADER Header
    #field int Mask
    #field int Flags
    #field GUID ObjectType
    #field GUID InheritedObjectType
    #field int SidStart
#endstruct

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