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

SYSTEM_AUDIT_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 が成功したアクセス試行、失敗したアクセス試行、またはその両方を監査するかどうかを示すフラグも含まれます。ACE_HEADER 構造体の AceType メンバーには SYSTEM_AUDIT_OBJECT_ACE_TYPE を設定し、AceSize メンバーには SYSTEM_AUDIT_OBJECT_ACE 構造体に割り当てられた合計バイト数を設定します。
MaskDWORD4+4+4ACCESS_MASK であり、トラスティによるアクセス試行についてシステムが監査するアクセス権を指定します。
FlagsSYSTEM_AUDIT_OBJECT_ACE_FLAGS4+8+8

ObjectType メンバーと InheritedObjectType メンバーが GUID を格納しているかどうかを示すビットフラグのセットです。このメンバーには、次の値の組み合わせを指定できます。未定義のビットはすべて 0 に設定してください。

意味
ACE_OBJECT_TYPE_PRESENT
ObjectType メンバーに GUID が格納されています。
ACE_INHERITED_OBJECT_TYPE_PRESENT
InheritedObjectType メンバーに GUID が格納されています。
ObjectTypeGUID16+12+12

プロパティセット、プロパティ、拡張権限、または子オブジェクトの種類を識別する GUID 構造体です。

このメンバーが有効なのは、Flags メンバーに ACE_OBJECT_TYPE_PRESENT ビットが設定されている場合のみです。設定されていない場合、ObjectType は無視されます。

この GUID の用途は、Mask メンバーで指定されたアクセス権によって異なります。

このメンバーには、次のいずれかの値を指定できます。

意味
ADS_RIGHT_DS_READ_PROP and/or ADS_RIGHT_DS_WRITE_PROP
ObjectType GUID は、オブジェクトのプロパティセットまたはプロパティを識別します。この ACE は、トラスティによるそのプロパティまたはプロパティセットの読み取りや書き込みの試行に対する監査を制御します。
ADS_RIGHT_DS_CONTROL_ACCESS
ObjectType GUID は、拡張アクセス権を識別します。
ADS_RIGHT_DS_CREATE_CHILD
ObjectType GUID は、子オブジェクトの種類を識別します。この ACE は、トラスティによるこの種類の子オブジェクトの作成試行に対する監査を制御します。
ADS_RIGHT_DS_SELF
ObjectType GUID は、検証付き書き込みを識別します。
InheritedObjectTypeGUID16+28+28

ACE を継承できる子オブジェクトの種類を識別する GUID 構造体です。

このメンバーが有効なのは、Flags メンバーに ACE_INHERITED_OBJECT_TYPE_PRESENT ビットが設定されている場合のみです。このビットが設定されていない場合、InheritedObjectType は無視され、すべての種類の子オブジェクトが ACE を継承できます。いずれの場合も、継承は 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 メンバーで指定されたオフセットから始まります。

公式ドキュメント

SYSTEM_AUDIT_OBJECT_ACE 構造体は、システムアクセス制御リスト (SACL) のアクセス制御エントリ (ACE) を定義します。この ACE は、オブジェクトへのアクセス、またはプロパティセットやプロパティなどのサブオブジェクトへのアクセスを監査できます。ACE には、アクセス権のセット、オブジェクトまたはサブオブジェクトの種類を識別する GUID、およびシステムがアクセスを監査する対象のトラスティを識別するセキュリティ識別子 (SID) が含まれます。また、ACE には、子オブジェクトによる ACE の継承を制御する GUID とフラグのセットも含まれます。

解説(Remarks)

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

SYSTEM_AUDIT_OBJECT_ACE を含む ACL は、その ACE_HEADER 構造体でリビジョン番号 ACL_REVISION_DS を指定する必要があります。

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

SYSTEM_AUDIT_OBJECT_ACE 構造体は、AddAuditAccessObjectAce 関数を呼び出すことで、アクセス制御リスト (ACL) 内に作成できます。この関数を使用すると、ObjectType メンバーと InheritedObjectType メンバーの一方または両方が存在する場合はそれらの GUID 構造体を格納するため、およびトラスティの SID を格納するために必要な正しい量のメモリが自動的に割り当てられます。さらに、Header.AceType メンバーと Header.AceSize メンバーの値も自動的に設定されます。 ACL の外部で SYSTEM_AUDIT_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;

// SYSTEM_AUDIT_OBJECT_ACE  (x64 48 / x86 48 バイト)
typedef struct SYSTEM_AUDIT_OBJECT_ACE {
    ACE_HEADER Header;
    DWORD Mask;
    SYSTEM_AUDIT_OBJECT_ACE_FLAGS Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} SYSTEM_AUDIT_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 SYSTEM_AUDIT_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 SYSTEM_AUDIT_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 SYSTEM_AUDIT_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 SYSTEM_AUDIT_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 SYSTEM_AUDIT_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;

  SYSTEM_AUDIT_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 SYSTEM_AUDIT_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

  SYSTEM_AUDIT_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 SYSTEM_AUDIT_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 レイアウト)
; SYSTEM_AUDIT_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 SYSTEM_AUDIT_OBJECT_ACE
    #field ACE_HEADER Header
    #field int Mask
    #field int Flags
    #field GUID ObjectType
    #field GUID InheritedObjectType
    #field int SidStart
#endstruct

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