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

ACCESS_ALLOWED_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_OBJECT_ACE_TYPE を設定し、AceSize メンバーには ACCESS_ALLOWED_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 にはアプリケーションデータを付加できます。

このメンバーのオフセットは変化します。Flags メンバーが 0 の場合、SidStart メンバーは ObjectType メンバーで指定されたオフセットから始まります。Flags にフラグが 1 つだけ (ACE_OBJECT_TYPE_PRESENT または ACE_INHERITED_OBJECT_TYPE_PRESENT のいずれか) 含まれている場合、SidStart メンバーは InheritedObjectType メンバーで指定されたオフセットから始まります。

公式ドキュメント

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

解説(Remarks)

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

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

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

ACCESS_ALLOWED_OBJECT_ACE 構造体は、AddAccessAllowedObjectAce 関数を呼び出すことでアクセス制御リスト (ACL) 内に作成できます。この関数を使用すると、ObjectType メンバーと InheritedObjectType メンバーの一方または両方が存在する場合にそれらの GUID 構造体を格納するために必要なメモリ量、およびトラスティの SID を格納するために必要なメモリ量が自動的に割り当てられます。さらに、Header.AceType メンバーと Header.AceSize メンバーの値も自動的に設定されます。 ACL の外部で ACCESS_ALLOWED_OBJECT_ACE 構造体を作成する場合は、ObjectType メンバーと InheritedObjectType メンバーの一方または両方が存在する場合にそれらの GUID 構造体を格納するために十分なメモリ、および SidStart メンバーとそれに続く連続したメモリにトラスティの完全な SID を格納するために十分なメモリを割り当てる必要があります。さらに、Header.AceType メンバーと Header.AceSize メンバーの値は、アプリケーションが明示的に設定する必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_OBJECT_ACE  (x64 48 / x86 48 バイト)
typedef struct ACCESS_ALLOWED_OBJECT_ACE {
    ACE_HEADER Header;
    DWORD Mask;
    SYSTEM_AUDIT_OBJECT_ACE_FLAGS Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} ACCESS_ALLOWED_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_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_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_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_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_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_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_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_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_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_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_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_OBJECT_ACE        ; NSTRUCT 変数を確保
st->Mask = 100
mes "Mask=" + st->Mask