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

SetNamedSecurityInfoA

関数
名前付きオブジェクトのセキュリティ情報を設定する(ANSI版)。
DLLADVAPI32.dll文字セットANSI (-A)呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

WIN32_ERROR SetNamedSecurityInfoA(
    LPSTR pObjectName,
    SE_OBJECT_TYPE ObjectType,
    OBJECT_SECURITY_INFORMATION SecurityInfo,
    PSID psidOwner,   // optional
    PSID psidGroup,   // optional
    ACL* pDacl,   // optional
    ACL* pSacl   // optional
);

パラメーター

名前方向説明
pObjectNameLPSTRin

セキュリティ情報を設定する対象オブジェクトの名前を指定する null 終端文字列へのポインターです。NTFS ファイルシステム上のローカルまたはリモートのファイルやディレクトリ、ネットワーク共有、レジストリキー、セマフォ、イベント、ミューテックス、ファイルマッピング、または待機可能タイマーの名前を指定できます。

オブジェクトの種類ごとの文字列形式については、 SE_OBJECT_TYPE を参照してください。

ObjectTypeSE_OBJECT_TYPEinpObjectName パラメーターで指定したオブジェクトの種類を示す SE_OBJECT_TYPE 列挙の値です。
SecurityInfoOBJECT_SECURITY_INFORMATIONin設定するセキュリティ情報の種類を示すビットフラグのセットです。このパラメーターには、SECURITY_INFORMATION ビットフラグの組み合わせを指定できます。
psidOwnerPSIDinoptionalオブジェクトの所有者を識別する SID 構造体へのポインターです。呼び出し元が SeRestorePrivilege 定数(Privilege Constants を参照)を持たない場合、この SID は呼び出し元のトークンに含まれており、かつ SE_GROUP_OWNER アクセス許可が有効である必要があります。SecurityInfo パラメーターには OWNER_SECURITY_INFORMATION フラグを含める必要があります。所有者を設定するには、呼び出し元がオブジェクトに対する WRITE_OWNER アクセス権を持つか、SE_TAKE_OWNERSHIP_NAME 特権を有効にしている必要があります。所有者 SID を設定しない場合、このパラメーターには NULL を指定できます。
psidGroupPSIDinoptionalオブジェクトのプライマリグループを識別する SID へのポインターです。SecurityInfo パラメーターには GROUP_SECURITY_INFORMATION フラグを含める必要があります。プライマリグループ SID を設定しない場合、このパラメーターには NULL を指定できます。
pDaclACL*inoptionalオブジェクトの新しい DACL へのポインターです。SecurityInfo パラメーターには DACL_SECURITY_INFORMATION フラグを含める必要があります。呼び出し元はオブジェクトに対する WRITE_DAC アクセス権を持つか、オブジェクトの所有者である必要があります。DACL を設定しない場合、このパラメーターには NULL を指定できます。
pSaclACL*inoptional

オブジェクトの新しい SACL へのポインターです。SecurityInfo パラメーターには、次のいずれかのフラグを含める必要があります。SACL_SECURITY_INFORMATIONLABEL_SECURITY_INFORMATIONATTRIBUTE_SECURITY_INFORMATIONSCOPE_SECURITY_INFORMATION、または BACKUP_SECURITY_INFORMATION

SACL_SECURITY_INFORMATION または SCOPE_SECURITY_INFORMATION を設定する場合、呼び出し元は SE_SECURITY_NAME 特権を有効にしている必要があります。SACL を設定しない場合、このパラメーターには NULL を指定できます。

戻り値の型: WIN32_ERROR

公式ドキュメント

指定したオブジェクトのセキュリティ記述子に、指定したセキュリティ情報を設定します。(ANSI)

戻り値

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

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

解説(Remarks)

オブジェクトの discretionary access control list(DACL)または system access control list(SACL)内の要素を設定すると、システムは 継承規則に従って、継承可能な access control entries(ACE)を既存の子オブジェクトに自動的に伝播します。

SetNamedSecurityInfo 関数は、次の種類のオブジェクトで使用できます。

SetNamedSecurityInfo 関数は、推奨される順序に基づいてアクセス許可 ACE やアクセス拒否 ACE を並べ替えることはありません。継承可能な ACE を既存の子オブジェクトに伝播する際、SetNamedSecurityInfo は、子オブジェクトの DACL 内のすべての非継承 ACE の後に、継承された ACE を配置します。

この関数は情報を plaintext で転送します。この関数で転送される情報は、システムで署名が無効化されていない限り署名されますが、暗号化は行われません。

\Test\TestFolder のような UNC パスで示されるフォルダーのアクセス権を更新すると、元の継承された ACE が削除され、ボリュームのフルパスは含まれません。

この関数を使用する例については、Modifying the ACLs of an Object または Taking Object Ownership を参照してください。

メモ

aclapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして SetNamedSecurityInfo を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じ、コンパイルエラーや実行時エラーの原因となる場合があります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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 SetNamedSecurityInfoA(
    LPSTR pObjectName,
    SE_OBJECT_TYPE ObjectType,
    OBJECT_SECURITY_INFORMATION SecurityInfo,
    PSID psidOwner,   // optional
    PSID psidGroup,   // optional
    ACL* pDacl,   // optional
    ACL* pSacl   // optional
);
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint SetNamedSecurityInfoA(
    [MarshalAs(UnmanagedType.LPStr)] string pObjectName,   // LPSTR
    int ObjectType,   // SE_OBJECT_TYPE
    uint SecurityInfo,   // OBJECT_SECURITY_INFORMATION
    IntPtr psidOwner,   // PSID optional
    IntPtr psidGroup,   // PSID optional
    IntPtr pDacl,   // ACL* optional
    IntPtr pSacl   // ACL* optional
);
<DllImport("ADVAPI32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function SetNamedSecurityInfoA(
    <MarshalAs(UnmanagedType.LPStr)> pObjectName As String,   ' LPSTR
    ObjectType As Integer,   ' SE_OBJECT_TYPE
    SecurityInfo As UInteger,   ' OBJECT_SECURITY_INFORMATION
    psidOwner As IntPtr,   ' PSID optional
    psidGroup As IntPtr,   ' PSID optional
    pDacl As IntPtr,   ' ACL* optional
    pSacl As IntPtr   ' ACL* optional
) As UInteger
End Function
' pObjectName : LPSTR
' ObjectType : SE_OBJECT_TYPE
' SecurityInfo : OBJECT_SECURITY_INFORMATION
' psidOwner : PSID optional
' psidGroup : PSID optional
' pDacl : ACL* optional
' pSacl : ACL* optional
Declare PtrSafe Function SetNamedSecurityInfoA Lib "advapi32" ( _
    ByVal pObjectName As String, _
    ByVal ObjectType As Long, _
    ByVal SecurityInfo As Long, _
    ByVal psidOwner As LongPtr, _
    ByVal psidGroup As LongPtr, _
    ByVal pDacl As LongPtr, _
    ByVal pSacl As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SetNamedSecurityInfoA = ctypes.windll.advapi32.SetNamedSecurityInfoA
SetNamedSecurityInfoA.restype = wintypes.DWORD
SetNamedSecurityInfoA.argtypes = [
    wintypes.LPCSTR,  # pObjectName : LPSTR
    ctypes.c_int,  # ObjectType : SE_OBJECT_TYPE
    wintypes.DWORD,  # SecurityInfo : OBJECT_SECURITY_INFORMATION
    wintypes.HANDLE,  # psidOwner : PSID optional
    wintypes.HANDLE,  # psidGroup : PSID optional
    ctypes.c_void_p,  # pDacl : ACL* optional
    ctypes.c_void_p,  # pSacl : ACL* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
SetNamedSecurityInfoA = Fiddle::Function.new(
  lib['SetNamedSecurityInfoA'],
  [
    Fiddle::TYPE_VOIDP,  # pObjectName : LPSTR
    Fiddle::TYPE_INT,  # ObjectType : SE_OBJECT_TYPE
    -Fiddle::TYPE_INT,  # SecurityInfo : OBJECT_SECURITY_INFORMATION
    Fiddle::TYPE_VOIDP,  # psidOwner : PSID optional
    Fiddle::TYPE_VOIDP,  # psidGroup : PSID optional
    Fiddle::TYPE_VOIDP,  # pDacl : ACL* optional
    Fiddle::TYPE_VOIDP,  # pSacl : ACL* optional
  ],
  -Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn SetNamedSecurityInfoA(
        pObjectName: *mut u8,  // LPSTR
        ObjectType: i32,  // SE_OBJECT_TYPE
        SecurityInfo: u32,  // OBJECT_SECURITY_INFORMATION
        psidOwner: *mut core::ffi::c_void,  // PSID optional
        psidGroup: *mut core::ffi::c_void,  // PSID optional
        pDacl: *mut ACL,  // ACL* optional
        pSacl: *mut ACL  // ACL* optional
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi)]
public static extern uint SetNamedSecurityInfoA([MarshalAs(UnmanagedType.LPStr)] string pObjectName, int ObjectType, uint SecurityInfo, IntPtr psidOwner, IntPtr psidGroup, IntPtr pDacl, IntPtr pSacl);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_SetNamedSecurityInfoA' -Namespace Win32 -PassThru
# $api::SetNamedSecurityInfoA(pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
#uselib "ADVAPI32.dll"
#func global SetNamedSecurityInfoA "SetNamedSecurityInfoA" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; SetNamedSecurityInfoA pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, varptr(pDacl), varptr(pSacl)   ; 戻り値は stat
; pObjectName : LPSTR -> "sptr"
; ObjectType : SE_OBJECT_TYPE -> "sptr"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "sptr"
; psidOwner : PSID optional -> "sptr"
; psidGroup : PSID optional -> "sptr"
; pDacl : ACL* optional -> "sptr"
; pSacl : ACL* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global SetNamedSecurityInfoA "SetNamedSecurityInfoA" str, int, int, sptr, sptr, var, var
; res = SetNamedSecurityInfoA(pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
; pObjectName : LPSTR -> "str"
; ObjectType : SE_OBJECT_TYPE -> "int"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "int"
; psidOwner : PSID optional -> "sptr"
; psidGroup : PSID optional -> "sptr"
; pDacl : ACL* optional -> "var"
; pSacl : ACL* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; WIN32_ERROR SetNamedSecurityInfoA(LPSTR pObjectName, SE_OBJECT_TYPE ObjectType, OBJECT_SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, ACL* pDacl, ACL* pSacl)
#uselib "ADVAPI32.dll"
#cfunc global SetNamedSecurityInfoA "SetNamedSecurityInfoA" str, int, int, intptr, intptr, var, var
; res = SetNamedSecurityInfoA(pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
; pObjectName : LPSTR -> "str"
; ObjectType : SE_OBJECT_TYPE -> "int"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "int"
; psidOwner : PSID optional -> "intptr"
; psidGroup : PSID optional -> "intptr"
; pDacl : ACL* optional -> "var"
; pSacl : ACL* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procSetNamedSecurityInfoA = advapi32.NewProc("SetNamedSecurityInfoA")
)

// pObjectName (LPSTR), ObjectType (SE_OBJECT_TYPE), SecurityInfo (OBJECT_SECURITY_INFORMATION), psidOwner (PSID optional), psidGroup (PSID optional), pDacl (ACL* optional), pSacl (ACL* optional)
r1, _, err := procSetNamedSecurityInfoA.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(pObjectName))),
	uintptr(ObjectType),
	uintptr(SecurityInfo),
	uintptr(psidOwner),
	uintptr(psidGroup),
	uintptr(pDacl),
	uintptr(pSacl),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // WIN32_ERROR
function SetNamedSecurityInfoA(
  pObjectName: PAnsiChar;   // LPSTR
  ObjectType: Integer;   // SE_OBJECT_TYPE
  SecurityInfo: DWORD;   // OBJECT_SECURITY_INFORMATION
  psidOwner: THandle;   // PSID optional
  psidGroup: THandle;   // PSID optional
  pDacl: Pointer;   // ACL* optional
  pSacl: Pointer   // ACL* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'SetNamedSecurityInfoA';
result := DllCall("ADVAPI32\SetNamedSecurityInfoA"
    , "AStr", pObjectName   ; LPSTR
    , "Int", ObjectType   ; SE_OBJECT_TYPE
    , "UInt", SecurityInfo   ; OBJECT_SECURITY_INFORMATION
    , "Ptr", psidOwner   ; PSID optional
    , "Ptr", psidGroup   ; PSID optional
    , "Ptr", pDacl   ; ACL* optional
    , "Ptr", pSacl   ; ACL* optional
    , "UInt")   ; return: WIN32_ERROR
●SetNamedSecurityInfoA(pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl) = DLL("ADVAPI32.dll", "dword SetNamedSecurityInfoA(char*, int, dword, void*, void*, void*, void*)")
# 呼び出し: SetNamedSecurityInfoA(pObjectName, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
# pObjectName : LPSTR -> "char*"
# ObjectType : SE_OBJECT_TYPE -> "int"
# SecurityInfo : OBJECT_SECURITY_INFORMATION -> "dword"
# psidOwner : PSID optional -> "void*"
# psidGroup : PSID optional -> "void*"
# pDacl : ACL* optional -> "void*"
# pSacl : ACL* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef SetNamedSecurityInfoANative = Uint32 Function(Pointer<Utf8>, Int32, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef SetNamedSecurityInfoADart = int Function(Pointer<Utf8>, int, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final SetNamedSecurityInfoA = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<SetNamedSecurityInfoANative, SetNamedSecurityInfoADart>('SetNamedSecurityInfoA');
// pObjectName : LPSTR -> Pointer<Utf8>
// ObjectType : SE_OBJECT_TYPE -> Int32
// SecurityInfo : OBJECT_SECURITY_INFORMATION -> Uint32
// psidOwner : PSID optional -> Pointer<Void>
// psidGroup : PSID optional -> Pointer<Void>
// pDacl : ACL* optional -> Pointer<Void>
// pSacl : ACL* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SetNamedSecurityInfoA(
  pObjectName: PAnsiChar;   // LPSTR
  ObjectType: Integer;   // SE_OBJECT_TYPE
  SecurityInfo: DWORD;   // OBJECT_SECURITY_INFORMATION
  psidOwner: THandle;   // PSID optional
  psidGroup: THandle;   // PSID optional
  pDacl: Pointer;   // ACL* optional
  pSacl: Pointer   // ACL* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'SetNamedSecurityInfoA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetNamedSecurityInfoA"
  c_SetNamedSecurityInfoA :: CString -> Int32 -> Word32 -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- pObjectName : LPSTR -> CString
-- ObjectType : SE_OBJECT_TYPE -> Int32
-- SecurityInfo : OBJECT_SECURITY_INFORMATION -> Word32
-- psidOwner : PSID optional -> Ptr ()
-- psidGroup : PSID optional -> Ptr ()
-- pDacl : ACL* optional -> Ptr ()
-- pSacl : ACL* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setnamedsecurityinfoa =
  foreign "SetNamedSecurityInfoA"
    (string @-> int32_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* pObjectName : LPSTR -> string *)
(* ObjectType : SE_OBJECT_TYPE -> int32_t *)
(* SecurityInfo : OBJECT_SECURITY_INFORMATION -> uint32_t *)
(* psidOwner : PSID optional -> (ptr void) *)
(* psidGroup : PSID optional -> (ptr void) *)
(* pDacl : ACL* optional -> (ptr void) *)
(* pSacl : ACL* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("SetNamedSecurityInfoA" set-named-security-info-a :convention :stdcall) :uint32
  (p-object-name :string)   ; LPSTR
  (object-type :int32)   ; SE_OBJECT_TYPE
  (security-info :uint32)   ; OBJECT_SECURITY_INFORMATION
  (psid-owner :pointer)   ; PSID optional
  (psid-group :pointer)   ; PSID optional
  (p-dacl :pointer)   ; ACL* optional
  (p-sacl :pointer))   ; ACL* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetNamedSecurityInfoA = Win32::API::More->new('ADVAPI32',
    'DWORD SetNamedSecurityInfoA(LPCSTR pObjectName, int ObjectType, DWORD SecurityInfo, HANDLE psidOwner, HANDLE psidGroup, LPVOID pDacl, LPVOID pSacl)');
# my $ret = $SetNamedSecurityInfoA->Call($pObjectName, $ObjectType, $SecurityInfo, $psidOwner, $psidGroup, $pDacl, $pSacl);
# pObjectName : LPSTR -> LPCSTR
# ObjectType : SE_OBJECT_TYPE -> int
# SecurityInfo : OBJECT_SECURITY_INFORMATION -> DWORD
# psidOwner : PSID optional -> HANDLE
# psidGroup : PSID optional -> HANDLE
# pDacl : ACL* optional -> LPVOID
# pSacl : ACL* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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