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

SetEntriesInAclA

関数
明示的アクセスエントリのリストから新しいACLを作成する(ANSI版)。
DLLADVAPI32.dll文字セットANSI (-A)呼出規約winapi対応OSWindows XP 以降

シグネチャ

// ADVAPI32.dll  (ANSI / -A)
#include <windows.h>

WIN32_ERROR SetEntriesInAclA(
    DWORD cCountOfExplicitEntries,
    EXPLICIT_ACCESS_A* pListOfExplicitEntries,   // optional
    ACL* OldAcl,   // optional
    ACL** NewAcl
);

パラメーター

名前方向説明
cCountOfExplicitEntriesDWORDinpListOfExplicitEntries 配列内の EXPLICIT_ACCESS 構造体の数。
pListOfExplicitEntriesEXPLICIT_ACCESS_A*inoptional既存の ACL にマージするアクセス制御情報を記述した EXPLICIT_ACCESS 構造体の配列へのポインター。
OldAclACL*inoptional既存の ACL へのポインター。このパラメーターは NULL にすることができ、その場合、関数は EXPLICIT_ACCESS エントリに基づいて新しい ACL を作成します。
NewAclACL**out新しい ACL へのポインターを受け取る変数へのポインター。関数が成功した場合は、 LocalFree 関数を呼び出して、返されたバッファーを解放する必要があります。

戻り値の型: WIN32_ERROR

公式ドキュメント

新しいアクセス制御情報または監査制御情報を既存の ACL 構造体にマージして、新しいアクセス制御リスト (ACL) を作成します。(ANSI)

戻り値

関数が成功した場合、ERROR_SUCCESS を返します。

関数が失敗した場合、WinError.h で定義されている 0 以外のエラーコードを返します。

解説(Remarks)

EXPLICIT_ACCESS 構造体の配列内の各エントリは、指定された trustee に対するアクセス制御情報または監査制御情報を指定します。trustee には、ユーザー、グループ、またはその他の security identifier (SID) 値 (logon identifier やログオンの種類 (たとえば Windows サービスやバッチジョブ) など) を指定できます。trustee を識別するには、名前または SID を使用できます。

SetEntriesInAcl 関数を使用すると、discretionary access control list (DACL) または system access control list (SACL) 内の access control entries (ACE) のリストを変更できます。SetEntriesInAcl は、同一の ACL 内でアクセス制御情報と監査制御情報を混在させることを妨げませんが、その場合、結果として得られる ACL には無意味なエントリが含まれることに注意してください。

DACL の場合、 EXPLICIT_ACCESS 構造体の grfAccessMode メンバーは、trustee に対するアクセス権を許可、拒否、または取り消すかどうかを指定します。このメンバーには、次のいずれかの値を指定できます。

これらの値については、ACCESS_MODE を参照してください。

SetEntriesInAcl 関数は、新しいアクセス拒否 ACE を、新しい ACL の ACE リストの先頭に配置します。また、新しいアクセス許可 ACE を、既存のアクセス許可 ACE の直前に配置します。

SACL の場合、 EXPLICIT_ACCESS 構造体の grfAccessMode メンバーには、次の値を指定できます。

SET_AUDIT_FAILURESET_AUDIT_SUCCESS は組み合わせることができます。これらの値については、ACCESS_MODE を参照してください。

SetEntriesInAcl 関数は、新しいシステム監査 ACE を、新しい ACL の ACE リストの先頭に配置します。

この関数を使用する例については、オブジェクトの ACL の変更新しいオブジェクトのセキュリティ記述子の作成、または オブジェクトの所有権の取得 を参照してください。

メモ

aclapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして SetEntriesInAcl を定義します。エンコーディング中立のエイリアスの使用を、エンコーディング中立でないコードと混在させると、コンパイルエラーまたは実行時エラーを引き起こす不一致が生じる可能性があります。詳細については、関数プロトタイプの規則を参照してください。

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

各言語での呼び出し定義

// ADVAPI32.dll  (ANSI / -A)
#include <windows.h>

WIN32_ERROR SetEntriesInAclA(
    DWORD cCountOfExplicitEntries,
    EXPLICIT_ACCESS_A* pListOfExplicitEntries,   // optional
    ACL* OldAcl,   // optional
    ACL** NewAcl
);
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint SetEntriesInAclA(
    uint cCountOfExplicitEntries,   // DWORD
    IntPtr pListOfExplicitEntries,   // EXPLICIT_ACCESS_A* optional
    IntPtr OldAcl,   // ACL* optional
    IntPtr NewAcl   // ACL** out
);
<DllImport("ADVAPI32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function SetEntriesInAclA(
    cCountOfExplicitEntries As UInteger,   ' DWORD
    pListOfExplicitEntries As IntPtr,   ' EXPLICIT_ACCESS_A* optional
    OldAcl As IntPtr,   ' ACL* optional
    NewAcl As IntPtr   ' ACL** out
) As UInteger
End Function
' cCountOfExplicitEntries : DWORD
' pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional
' OldAcl : ACL* optional
' NewAcl : ACL** out
Declare PtrSafe Function SetEntriesInAclA Lib "advapi32" ( _
    ByVal cCountOfExplicitEntries As Long, _
    ByVal pListOfExplicitEntries As LongPtr, _
    ByVal OldAcl As LongPtr, _
    ByVal NewAcl As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SetEntriesInAclA = ctypes.windll.advapi32.SetEntriesInAclA
SetEntriesInAclA.restype = wintypes.DWORD
SetEntriesInAclA.argtypes = [
    wintypes.DWORD,  # cCountOfExplicitEntries : DWORD
    ctypes.c_void_p,  # pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional
    ctypes.c_void_p,  # OldAcl : ACL* optional
    ctypes.c_void_p,  # NewAcl : ACL** out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procSetEntriesInAclA = advapi32.NewProc("SetEntriesInAclA")
)

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

extern "advapi32" fn SetEntriesInAclA(
    cCountOfExplicitEntries: u32, // DWORD
    pListOfExplicitEntries: [*c]EXPLICIT_ACCESS_A, // EXPLICIT_ACCESS_A* optional
    OldAcl: [*c]ACL, // ACL* optional
    NewAcl: [*c][*c]ACL // ACL** out
) callconv(std.os.windows.WINAPI) u32;
proc SetEntriesInAclA(
    cCountOfExplicitEntries: uint32,  # DWORD
    pListOfExplicitEntries: ptr EXPLICIT_ACCESS_A,  # EXPLICIT_ACCESS_A* optional
    OldAcl: ptr ACL,  # ACL* optional
    NewAcl: ptr ACL  # ACL** out
): uint32 {.importc: "SetEntriesInAclA", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
uint SetEntriesInAclA(
    uint cCountOfExplicitEntries,   // DWORD
    EXPLICIT_ACCESS_A* pListOfExplicitEntries,   // EXPLICIT_ACCESS_A* optional
    ACL* OldAcl,   // ACL* optional
    ACL** NewAcl   // ACL** out
);
ccall((:SetEntriesInAclA, "ADVAPI32.dll"), stdcall, UInt32,
      (UInt32, Ptr{EXPLICIT_ACCESS_A}, Ptr{ACL}, Ptr{ACL}),
      cCountOfExplicitEntries, pListOfExplicitEntries, OldAcl, NewAcl)
# cCountOfExplicitEntries : DWORD -> UInt32
# pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> Ptr{EXPLICIT_ACCESS_A}
# OldAcl : ACL* optional -> Ptr{ACL}
# NewAcl : ACL** out -> Ptr{ACL}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t SetEntriesInAclA(
    uint32_t cCountOfExplicitEntries,
    void* pListOfExplicitEntries,
    void* OldAcl,
    void* NewAcl);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.SetEntriesInAclA(cCountOfExplicitEntries, pListOfExplicitEntries, OldAcl, NewAcl)
-- cCountOfExplicitEntries : DWORD
-- pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional
-- OldAcl : ACL* optional
-- NewAcl : ACL** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const SetEntriesInAclA = lib.func('__stdcall', 'SetEntriesInAclA', 'uint32_t', ['uint32_t', 'void *', 'void *', 'void *']);
// SetEntriesInAclA(cCountOfExplicitEntries, pListOfExplicitEntries, OldAcl, NewAcl)
// cCountOfExplicitEntries : DWORD -> 'uint32_t'
// pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> 'void *'
// OldAcl : ACL* optional -> 'void *'
// NewAcl : ACL** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  SetEntriesInAclA: { parameters: ["u32", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.SetEntriesInAclA(cCountOfExplicitEntries, pListOfExplicitEntries, OldAcl, NewAcl)
// cCountOfExplicitEntries : DWORD -> "u32"
// pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> "pointer"
// OldAcl : ACL* optional -> "pointer"
// NewAcl : ACL** out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t SetEntriesInAclA(
    uint32_t cCountOfExplicitEntries,
    void* pListOfExplicitEntries,
    void* OldAcl,
    void* NewAcl);
C, "ADVAPI32.dll");
// $ffi->SetEntriesInAclA(cCountOfExplicitEntries, pListOfExplicitEntries, OldAcl, NewAcl);
// cCountOfExplicitEntries : DWORD
// pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional
// OldAcl : ACL* optional
// NewAcl : ACL** out
// 構造体/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, W32APIOptions.ASCII_OPTIONS);
    int SetEntriesInAclA(
        int cCountOfExplicitEntries,   // DWORD
        Pointer pListOfExplicitEntries,   // EXPLICIT_ACCESS_A* optional
        Pointer OldAcl,   // ACL* optional
        Pointer NewAcl   // ACL** out
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun SetEntriesInAclA = SetEntriesInAclA(
    cCountOfExplicitEntries : UInt32,   # DWORD
    pListOfExplicitEntries : EXPLICIT_ACCESS_A*,   # EXPLICIT_ACCESS_A* optional
    OldAcl : ACL*,   # ACL* optional
    NewAcl : ACL**   # ACL** out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SetEntriesInAclANative = Uint32 Function(Uint32, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef SetEntriesInAclADart = int Function(int, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final SetEntriesInAclA = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<SetEntriesInAclANative, SetEntriesInAclADart>('SetEntriesInAclA');
// cCountOfExplicitEntries : DWORD -> Uint32
// pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> Pointer<Void>
// OldAcl : ACL* optional -> Pointer<Void>
// NewAcl : ACL** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SetEntriesInAclA(
  cCountOfExplicitEntries: DWORD;   // DWORD
  pListOfExplicitEntries: Pointer;   // EXPLICIT_ACCESS_A* optional
  OldAcl: Pointer;   // ACL* optional
  NewAcl: Pointer   // ACL** out
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'SetEntriesInAclA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetEntriesInAclA"
  c_SetEntriesInAclA :: Word32 -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- cCountOfExplicitEntries : DWORD -> Word32
-- pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> Ptr ()
-- OldAcl : ACL* optional -> Ptr ()
-- NewAcl : ACL** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setentriesinacla =
  foreign "SetEntriesInAclA"
    (uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* cCountOfExplicitEntries : DWORD -> uint32_t *)
(* pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> (ptr void) *)
(* OldAcl : ACL* optional -> (ptr void) *)
(* NewAcl : ACL** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("SetEntriesInAclA" set-entries-in-acl-a :convention :stdcall) :uint32
  (c-count-of-explicit-entries :uint32)   ; DWORD
  (p-list-of-explicit-entries :pointer)   ; EXPLICIT_ACCESS_A* optional
  (old-acl :pointer)   ; ACL* optional
  (new-acl :pointer))   ; ACL** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetEntriesInAclA = Win32::API::More->new('ADVAPI32',
    'DWORD SetEntriesInAclA(DWORD cCountOfExplicitEntries, LPVOID pListOfExplicitEntries, LPVOID OldAcl, LPVOID NewAcl)');
# my $ret = $SetEntriesInAclA->Call($cCountOfExplicitEntries, $pListOfExplicitEntries, $OldAcl, $NewAcl);
# cCountOfExplicitEntries : DWORD -> DWORD
# pListOfExplicitEntries : EXPLICIT_ACCESS_A* optional -> LPVOID
# OldAcl : ACL* optional -> LPVOID
# NewAcl : ACL** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型