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

InitializeAcl

関数
新しい空のACL構造体を初期化する。
DLLADVAPI32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// ADVAPI32.dll
#include <windows.h>

BOOL InitializeAcl(
    ACL* pAcl,
    DWORD nAclLength,
    ACE_REVISION dwAclRevision
);

パラメーター

名前方向説明
pAclACL*outこの関数によって初期化される ACL 構造体へのポインターです。この関数を呼び出す前に、pAcl 用のメモリを割り当ててください。
nAclLengthDWORDinpAcl パラメーターが指すバッファーの長さ (バイト単位) です。この値は、ACL ヘッダーと、ACL に格納されるすべての アクセス制御エントリ (ACE) を収めるのに十分な大きさである必要があります。さらに、この値は DWORD 境界に整列されている必要があります。ACL のサイズの計算方法の詳細については、「解説」を参照してください。
dwAclRevisionACE_REVISIONin

作成する ACL 構造体のリビジョン レベルです。

この値には ACL_REVISION または ACL_REVISION_DS を指定できます。アクセス制御リスト (ACL) がオブジェクト固有の ACE をサポートする場合は、ACL_REVISION_DS を使用してください。

戻り値の型: BOOL

公式ドキュメント

新しい ACL 構造体を初期化します。

戻り値

関数が成功した場合は、0 以外の値を返します。

関数が失敗した場合は、0 を返します。拡張エラー情報を取得するには、 GetLastError を呼び出してください。

解説(Remarks)

InitializeAcl 関数は、空の ACL 構造体を作成します。この ACL には ACE は含まれません。空の ACL をオブジェクトに適用すると、そのオブジェクトへのすべてのアクセスが拒否されます。

ACL の初期サイズは、使用する前に ACL に追加する予定の ACE の数に依存します。たとえば、ACL にユーザーとグループの ACE を含める場合は、2 つの ACE に基づいて ACL を初期化します。既存の ACL の変更の詳細については、オブジェクトの ACL の変更を参照してください。

ACL の初期サイズを計算するには、次の値を合計し、その結果を最も近い DWORD に整列させます。

次の例では、InitializeAcl 関数を呼び出します。ACL のサイズは、3 つのアクセス許可 ACE に基づいています。オプションとして、セキュリティ記述子定義言語 (SDDL) を使用して ACL を作成することもできます。詳細については、DACL の作成を参照してください。

この例では、簡略化のために一部の手順を省略しています。詳細については、オブジェクトの所有権の取得の例を参照してください。AllocateAndInitializeSid 関数を呼び出しているため、この例のコードの最後で FreeSid 関数を呼び出す必要があります。

#include <windows.h>
#include <Winbase.h>
#pragma comment(lib, "duser.lib")

#define NUM_OF_ACES 3

void main()
{
    PACL pAcl = NULL;
    DWORD cbAcl = 0;
    PSID psids[NUM_OF_ACES];

    // Allocate and initialize SIDs.
    // Step omitted - See Taking Object Ownership example.

    // Add the SID for each ACE to psids. 
    cbAcl = sizeof(ACL) + 
        ((sizeof(ACCESS_ALLOWED_ACE)) * NUM_OF_ACES);
    for (int i = 0; i < NUM_OF_ACES; i++)
    {
        cbAcl += GetLengthSid(psids[i]) - sizeof(DWORD);
    }

    // Align cbAcl to a DWORD.
    cbAcl = (cbAcl + (sizeof(DWORD) - 1)) & 0xfffffffc;

    pAcl = (ACL*)LocalAlloc(LPTR, cbAcl);
    if (pAcl)
    {
        if (InitializeAcl(pAcl, cbAcl, ACL_REVISION))
        {

            // Add the ACEs to the ACL.
            // Add the ACL to the object's security descriptor.
        }
        else
        {

            // Handle error.
        }
    }
    {

        // Handle error.
    }

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

各言語での呼び出し定義

// ADVAPI32.dll
#include <windows.h>

BOOL InitializeAcl(
    ACL* pAcl,
    DWORD nAclLength,
    ACE_REVISION dwAclRevision
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool InitializeAcl(
    IntPtr pAcl,   // ACL* out
    uint nAclLength,   // DWORD
    uint dwAclRevision   // ACE_REVISION
);
<DllImport("ADVAPI32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function InitializeAcl(
    pAcl As IntPtr,   ' ACL* out
    nAclLength As UInteger,   ' DWORD
    dwAclRevision As UInteger   ' ACE_REVISION
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' pAcl : ACL* out
' nAclLength : DWORD
' dwAclRevision : ACE_REVISION
Declare PtrSafe Function InitializeAcl Lib "advapi32" ( _
    ByVal pAcl As LongPtr, _
    ByVal nAclLength As Long, _
    ByVal dwAclRevision As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

InitializeAcl = ctypes.windll.advapi32.InitializeAcl
InitializeAcl.restype = wintypes.BOOL
InitializeAcl.argtypes = [
    ctypes.c_void_p,  # pAcl : ACL* out
    wintypes.DWORD,  # nAclLength : DWORD
    wintypes.DWORD,  # dwAclRevision : ACE_REVISION
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
InitializeAcl = Fiddle::Function.new(
  lib['InitializeAcl'],
  [
    Fiddle::TYPE_VOIDP,  # pAcl : ACL* out
    -Fiddle::TYPE_INT,  # nAclLength : DWORD
    -Fiddle::TYPE_INT,  # dwAclRevision : ACE_REVISION
  ],
  Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn InitializeAcl(
        pAcl: *mut ACL,  // ACL* out
        nAclLength: u32,  // DWORD
        dwAclRevision: u32  // ACE_REVISION
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true)]
public static extern bool InitializeAcl(IntPtr pAcl, uint nAclLength, uint dwAclRevision);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_InitializeAcl' -Namespace Win32 -PassThru
# $api::InitializeAcl(pAcl, nAclLength, dwAclRevision)
#uselib "ADVAPI32.dll"
#func global InitializeAcl "InitializeAcl" sptr, sptr, sptr
; InitializeAcl varptr(pAcl), nAclLength, dwAclRevision   ; 戻り値は stat
; pAcl : ACL* out -> "sptr"
; nAclLength : DWORD -> "sptr"
; dwAclRevision : ACE_REVISION -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global InitializeAcl "InitializeAcl" var, int, int
; res = InitializeAcl(pAcl, nAclLength, dwAclRevision)
; pAcl : ACL* out -> "var"
; nAclLength : DWORD -> "int"
; dwAclRevision : ACE_REVISION -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL InitializeAcl(ACL* pAcl, DWORD nAclLength, ACE_REVISION dwAclRevision)
#uselib "ADVAPI32.dll"
#cfunc global InitializeAcl "InitializeAcl" var, int, int
; res = InitializeAcl(pAcl, nAclLength, dwAclRevision)
; pAcl : ACL* out -> "var"
; nAclLength : DWORD -> "int"
; dwAclRevision : ACE_REVISION -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procInitializeAcl = advapi32.NewProc("InitializeAcl")
)

// pAcl (ACL* out), nAclLength (DWORD), dwAclRevision (ACE_REVISION)
r1, _, err := procInitializeAcl.Call(
	uintptr(pAcl),
	uintptr(nAclLength),
	uintptr(dwAclRevision),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function InitializeAcl(
  pAcl: Pointer;   // ACL* out
  nAclLength: DWORD;   // DWORD
  dwAclRevision: DWORD   // ACE_REVISION
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'InitializeAcl';
result := DllCall("ADVAPI32\InitializeAcl"
    , "Ptr", pAcl   ; ACL* out
    , "UInt", nAclLength   ; DWORD
    , "UInt", dwAclRevision   ; ACE_REVISION
    , "Int")   ; return: BOOL
●InitializeAcl(pAcl, nAclLength, dwAclRevision) = DLL("ADVAPI32.dll", "bool InitializeAcl(void*, dword, dword)")
# 呼び出し: InitializeAcl(pAcl, nAclLength, dwAclRevision)
# pAcl : ACL* out -> "void*"
# nAclLength : DWORD -> "dword"
# dwAclRevision : ACE_REVISION -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "advapi32" fn InitializeAcl(
    pAcl: [*c]ACL, // ACL* out
    nAclLength: u32, // DWORD
    dwAclRevision: u32 // ACE_REVISION
) callconv(std.os.windows.WINAPI) i32;
proc InitializeAcl(
    pAcl: ptr ACL,  # ACL* out
    nAclLength: uint32,  # DWORD
    dwAclRevision: uint32  # ACE_REVISION
): int32 {.importc: "InitializeAcl", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
int InitializeAcl(
    ACL* pAcl,   // ACL* out
    uint nAclLength,   // DWORD
    uint dwAclRevision   // ACE_REVISION
);
ccall((:InitializeAcl, "ADVAPI32.dll"), stdcall, Int32,
      (Ptr{ACL}, UInt32, UInt32),
      pAcl, nAclLength, dwAclRevision)
# pAcl : ACL* out -> Ptr{ACL}
# nAclLength : DWORD -> UInt32
# dwAclRevision : ACE_REVISION -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t InitializeAcl(
    void* pAcl,
    uint32_t nAclLength,
    uint32_t dwAclRevision);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.InitializeAcl(pAcl, nAclLength, dwAclRevision)
-- pAcl : ACL* out
-- nAclLength : DWORD
-- dwAclRevision : ACE_REVISION
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const InitializeAcl = lib.func('__stdcall', 'InitializeAcl', 'int32_t', ['void *', 'uint32_t', 'uint32_t']);
// InitializeAcl(pAcl, nAclLength, dwAclRevision)
// pAcl : ACL* out -> 'void *'
// nAclLength : DWORD -> 'uint32_t'
// dwAclRevision : ACE_REVISION -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  InitializeAcl: { parameters: ["pointer", "u32", "u32"], result: "i32" },
});
// lib.symbols.InitializeAcl(pAcl, nAclLength, dwAclRevision)
// pAcl : ACL* out -> "pointer"
// nAclLength : DWORD -> "u32"
// dwAclRevision : ACE_REVISION -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t InitializeAcl(
    void* pAcl,
    uint32_t nAclLength,
    uint32_t dwAclRevision);
C, "ADVAPI32.dll");
// $ffi->InitializeAcl(pAcl, nAclLength, dwAclRevision);
// pAcl : ACL* out
// nAclLength : DWORD
// dwAclRevision : ACE_REVISION
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Advapi32 extends StdCallLibrary {
    Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class);
    boolean InitializeAcl(
        Pointer pAcl,   // ACL* out
        int nAclLength,   // DWORD
        int dwAclRevision   // ACE_REVISION
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun InitializeAcl = InitializeAcl(
    pAcl : ACL*,   # ACL* out
    nAclLength : UInt32,   # DWORD
    dwAclRevision : UInt32   # ACE_REVISION
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef InitializeAclNative = Int32 Function(Pointer<Void>, Uint32, Uint32);
typedef InitializeAclDart = int Function(Pointer<Void>, int, int);
final InitializeAcl = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<InitializeAclNative, InitializeAclDart>('InitializeAcl');
// pAcl : ACL* out -> Pointer<Void>
// nAclLength : DWORD -> Uint32
// dwAclRevision : ACE_REVISION -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function InitializeAcl(
  pAcl: Pointer;   // ACL* out
  nAclLength: DWORD;   // DWORD
  dwAclRevision: DWORD   // ACE_REVISION
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'InitializeAcl';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "InitializeAcl"
  c_InitializeAcl :: Ptr () -> Word32 -> Word32 -> IO CInt
-- pAcl : ACL* out -> Ptr ()
-- nAclLength : DWORD -> Word32
-- dwAclRevision : ACE_REVISION -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let initializeacl =
  foreign "InitializeAcl"
    ((ptr void) @-> uint32_t @-> uint32_t @-> returning int32_t)
(* pAcl : ACL* out -> (ptr void) *)
(* nAclLength : DWORD -> uint32_t *)
(* dwAclRevision : ACE_REVISION -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("InitializeAcl" initialize-acl :convention :stdcall) :int32
  (p-acl :pointer)   ; ACL* out
  (n-acl-length :uint32)   ; DWORD
  (dw-acl-revision :uint32))   ; ACE_REVISION
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $InitializeAcl = Win32::API::More->new('ADVAPI32',
    'BOOL InitializeAcl(LPVOID pAcl, DWORD nAclLength, DWORD dwAclRevision)');
# my $ret = $InitializeAcl->Call($pAcl, $nAclLength, $dwAclRevision);
# pAcl : ACL* out -> LPVOID
# nAclLength : DWORD -> DWORD
# dwAclRevision : ACE_REVISION -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型