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

MakeAbsoluteSD

関数
自己相対形式のセキュリティ記述子を絶対形式に変換する。
DLLADVAPI32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

BOOL MakeAbsoluteSD(
    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,   // optional
    DWORD* lpdwAbsoluteSecurityDescriptorSize,
    ACL* pDacl,   // optional
    DWORD* lpdwDaclSize,
    ACL* pSacl,   // optional
    DWORD* lpdwSaclSize,
    PSID pOwner,   // optional
    DWORD* lpdwOwnerSize,
    PSID pPrimaryGroup,   // optional
    DWORD* lpdwPrimaryGroupSize
);

パラメーター

名前方向
pSelfRelativeSecurityDescriptorPSECURITY_DESCRIPTORin
pAbsoluteSecurityDescriptorPSECURITY_DESCRIPTORoutoptional
lpdwAbsoluteSecurityDescriptorSizeDWORD*inout
pDaclACL*outoptional
lpdwDaclSizeDWORD*inout
pSaclACL*outoptional
lpdwSaclSizeDWORD*inout
pOwnerPSIDoutoptional
lpdwOwnerSizeDWORD*inout
pPrimaryGroupPSIDoutoptional
lpdwPrimaryGroupSizeDWORD*inout

戻り値の型: BOOL

各言語での呼び出し定義

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

BOOL MakeAbsoluteSD(
    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,   // optional
    DWORD* lpdwAbsoluteSecurityDescriptorSize,
    ACL* pDacl,   // optional
    DWORD* lpdwDaclSize,
    ACL* pSacl,   // optional
    DWORD* lpdwSaclSize,
    PSID pOwner,   // optional
    DWORD* lpdwOwnerSize,
    PSID pPrimaryGroup,   // optional
    DWORD* lpdwPrimaryGroupSize
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool MakeAbsoluteSD(
    IntPtr pSelfRelativeSecurityDescriptor,   // PSECURITY_DESCRIPTOR
    IntPtr pAbsoluteSecurityDescriptor,   // PSECURITY_DESCRIPTOR optional, out
    ref uint lpdwAbsoluteSecurityDescriptorSize,   // DWORD* in/out
    IntPtr pDacl,   // ACL* optional, out
    ref uint lpdwDaclSize,   // DWORD* in/out
    IntPtr pSacl,   // ACL* optional, out
    ref uint lpdwSaclSize,   // DWORD* in/out
    IntPtr pOwner,   // PSID optional, out
    ref uint lpdwOwnerSize,   // DWORD* in/out
    IntPtr pPrimaryGroup,   // PSID optional, out
    ref uint lpdwPrimaryGroupSize   // DWORD* in/out
);
<DllImport("ADVAPI32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function MakeAbsoluteSD(
    pSelfRelativeSecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR
    pAbsoluteSecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR optional, out
    ByRef lpdwAbsoluteSecurityDescriptorSize As UInteger,   ' DWORD* in/out
    pDacl As IntPtr,   ' ACL* optional, out
    ByRef lpdwDaclSize As UInteger,   ' DWORD* in/out
    pSacl As IntPtr,   ' ACL* optional, out
    ByRef lpdwSaclSize As UInteger,   ' DWORD* in/out
    pOwner As IntPtr,   ' PSID optional, out
    ByRef lpdwOwnerSize As UInteger,   ' DWORD* in/out
    pPrimaryGroup As IntPtr,   ' PSID optional, out
    ByRef lpdwPrimaryGroupSize As UInteger   ' DWORD* in/out
) As Boolean
End Function
' pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
' pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
' lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
' pDacl : ACL* optional, out
' lpdwDaclSize : DWORD* in/out
' pSacl : ACL* optional, out
' lpdwSaclSize : DWORD* in/out
' pOwner : PSID optional, out
' lpdwOwnerSize : DWORD* in/out
' pPrimaryGroup : PSID optional, out
' lpdwPrimaryGroupSize : DWORD* in/out
Declare PtrSafe Function MakeAbsoluteSD Lib "advapi32" ( _
    ByVal pSelfRelativeSecurityDescriptor As LongPtr, _
    ByVal pAbsoluteSecurityDescriptor As LongPtr, _
    ByRef lpdwAbsoluteSecurityDescriptorSize As Long, _
    ByVal pDacl As LongPtr, _
    ByRef lpdwDaclSize As Long, _
    ByVal pSacl As LongPtr, _
    ByRef lpdwSaclSize As Long, _
    ByVal pOwner As LongPtr, _
    ByRef lpdwOwnerSize As Long, _
    ByVal pPrimaryGroup As LongPtr, _
    ByRef lpdwPrimaryGroupSize As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MakeAbsoluteSD = ctypes.windll.advapi32.MakeAbsoluteSD
MakeAbsoluteSD.restype = wintypes.BOOL
MakeAbsoluteSD.argtypes = [
    wintypes.HANDLE,  # pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
    wintypes.HANDLE,  # pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
    ctypes.c_void_p,  # pDacl : ACL* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwDaclSize : DWORD* in/out
    ctypes.c_void_p,  # pSacl : ACL* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwSaclSize : DWORD* in/out
    wintypes.HANDLE,  # pOwner : PSID optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwOwnerSize : DWORD* in/out
    wintypes.HANDLE,  # pPrimaryGroup : PSID optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwPrimaryGroupSize : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
MakeAbsoluteSD = Fiddle::Function.new(
  lib['MakeAbsoluteSD'],
  [
    Fiddle::TYPE_VOIDP,  # pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
    Fiddle::TYPE_VOIDP,  # pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
    Fiddle::TYPE_VOIDP,  # lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pDacl : ACL* optional, out
    Fiddle::TYPE_VOIDP,  # lpdwDaclSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pSacl : ACL* optional, out
    Fiddle::TYPE_VOIDP,  # lpdwSaclSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pOwner : PSID optional, out
    Fiddle::TYPE_VOIDP,  # lpdwOwnerSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pPrimaryGroup : PSID optional, out
    Fiddle::TYPE_VOIDP,  # lpdwPrimaryGroupSize : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn MakeAbsoluteSD(
        pSelfRelativeSecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR
        pAbsoluteSecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR optional, out
        lpdwAbsoluteSecurityDescriptorSize: *mut u32,  // DWORD* in/out
        pDacl: *mut ACL,  // ACL* optional, out
        lpdwDaclSize: *mut u32,  // DWORD* in/out
        pSacl: *mut ACL,  // ACL* optional, out
        lpdwSaclSize: *mut u32,  // DWORD* in/out
        pOwner: *mut core::ffi::c_void,  // PSID optional, out
        lpdwOwnerSize: *mut u32,  // DWORD* in/out
        pPrimaryGroup: *mut core::ffi::c_void,  // PSID optional, out
        lpdwPrimaryGroupSize: *mut u32  // DWORD* in/out
    ) -> 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 MakeAbsoluteSD(IntPtr pSelfRelativeSecurityDescriptor, IntPtr pAbsoluteSecurityDescriptor, ref uint lpdwAbsoluteSecurityDescriptorSize, IntPtr pDacl, ref uint lpdwDaclSize, IntPtr pSacl, ref uint lpdwSaclSize, IntPtr pOwner, ref uint lpdwOwnerSize, IntPtr pPrimaryGroup, ref uint lpdwPrimaryGroupSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_MakeAbsoluteSD' -Namespace Win32 -PassThru
# $api::MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
#uselib "ADVAPI32.dll"
#func global MakeAbsoluteSD "MakeAbsoluteSD" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; MakeAbsoluteSD pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, varptr(lpdwAbsoluteSecurityDescriptorSize), varptr(pDacl), varptr(lpdwDaclSize), varptr(pSacl), varptr(lpdwSaclSize), pOwner, varptr(lpdwOwnerSize), pPrimaryGroup, varptr(lpdwPrimaryGroupSize)   ; 戻り値は stat
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "sptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "sptr"
; pDacl : ACL* optional, out -> "sptr"
; lpdwDaclSize : DWORD* in/out -> "sptr"
; pSacl : ACL* optional, out -> "sptr"
; lpdwSaclSize : DWORD* in/out -> "sptr"
; pOwner : PSID optional, out -> "sptr"
; lpdwOwnerSize : DWORD* in/out -> "sptr"
; pPrimaryGroup : PSID optional, out -> "sptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global MakeAbsoluteSD "MakeAbsoluteSD" sptr, sptr, var, var, var, var, var, sptr, var, sptr, var
; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "sptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "var"
; pDacl : ACL* optional, out -> "var"
; lpdwDaclSize : DWORD* in/out -> "var"
; pSacl : ACL* optional, out -> "var"
; lpdwSaclSize : DWORD* in/out -> "var"
; pOwner : PSID optional, out -> "sptr"
; lpdwOwnerSize : DWORD* in/out -> "var"
; pPrimaryGroup : PSID optional, out -> "sptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL MakeAbsoluteSD(PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, DWORD* lpdwAbsoluteSecurityDescriptorSize, ACL* pDacl, DWORD* lpdwDaclSize, ACL* pSacl, DWORD* lpdwSaclSize, PSID pOwner, DWORD* lpdwOwnerSize, PSID pPrimaryGroup, DWORD* lpdwPrimaryGroupSize)
#uselib "ADVAPI32.dll"
#cfunc global MakeAbsoluteSD "MakeAbsoluteSD" intptr, intptr, var, var, var, var, var, intptr, var, intptr, var
; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "intptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "intptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "var"
; pDacl : ACL* optional, out -> "var"
; lpdwDaclSize : DWORD* in/out -> "var"
; pSacl : ACL* optional, out -> "var"
; lpdwSaclSize : DWORD* in/out -> "var"
; pOwner : PSID optional, out -> "intptr"
; lpdwOwnerSize : DWORD* in/out -> "var"
; pPrimaryGroup : PSID optional, out -> "intptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procMakeAbsoluteSD = advapi32.NewProc("MakeAbsoluteSD")
)

// pSelfRelativeSecurityDescriptor (PSECURITY_DESCRIPTOR), pAbsoluteSecurityDescriptor (PSECURITY_DESCRIPTOR optional, out), lpdwAbsoluteSecurityDescriptorSize (DWORD* in/out), pDacl (ACL* optional, out), lpdwDaclSize (DWORD* in/out), pSacl (ACL* optional, out), lpdwSaclSize (DWORD* in/out), pOwner (PSID optional, out), lpdwOwnerSize (DWORD* in/out), pPrimaryGroup (PSID optional, out), lpdwPrimaryGroupSize (DWORD* in/out)
r1, _, err := procMakeAbsoluteSD.Call(
	uintptr(pSelfRelativeSecurityDescriptor),
	uintptr(pAbsoluteSecurityDescriptor),
	uintptr(lpdwAbsoluteSecurityDescriptorSize),
	uintptr(pDacl),
	uintptr(lpdwDaclSize),
	uintptr(pSacl),
	uintptr(lpdwSaclSize),
	uintptr(pOwner),
	uintptr(lpdwOwnerSize),
	uintptr(pPrimaryGroup),
	uintptr(lpdwPrimaryGroupSize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function MakeAbsoluteSD(
  pSelfRelativeSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  pAbsoluteSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR optional, out
  lpdwAbsoluteSecurityDescriptorSize: Pointer;   // DWORD* in/out
  pDacl: Pointer;   // ACL* optional, out
  lpdwDaclSize: Pointer;   // DWORD* in/out
  pSacl: Pointer;   // ACL* optional, out
  lpdwSaclSize: Pointer;   // DWORD* in/out
  pOwner: THandle;   // PSID optional, out
  lpdwOwnerSize: Pointer;   // DWORD* in/out
  pPrimaryGroup: THandle;   // PSID optional, out
  lpdwPrimaryGroupSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'MakeAbsoluteSD';
result := DllCall("ADVAPI32\MakeAbsoluteSD"
    , "Ptr", pSelfRelativeSecurityDescriptor   ; PSECURITY_DESCRIPTOR
    , "Ptr", pAbsoluteSecurityDescriptor   ; PSECURITY_DESCRIPTOR optional, out
    , "Ptr", lpdwAbsoluteSecurityDescriptorSize   ; DWORD* in/out
    , "Ptr", pDacl   ; ACL* optional, out
    , "Ptr", lpdwDaclSize   ; DWORD* in/out
    , "Ptr", pSacl   ; ACL* optional, out
    , "Ptr", lpdwSaclSize   ; DWORD* in/out
    , "Ptr", pOwner   ; PSID optional, out
    , "Ptr", lpdwOwnerSize   ; DWORD* in/out
    , "Ptr", pPrimaryGroup   ; PSID optional, out
    , "Ptr", lpdwPrimaryGroupSize   ; DWORD* in/out
    , "Int")   ; return: BOOL
●MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize) = DLL("ADVAPI32.dll", "bool MakeAbsoluteSD(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
# pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "void*"
# pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "void*"
# lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "void*"
# pDacl : ACL* optional, out -> "void*"
# lpdwDaclSize : DWORD* in/out -> "void*"
# pSacl : ACL* optional, out -> "void*"
# lpdwSaclSize : DWORD* in/out -> "void*"
# pOwner : PSID optional, out -> "void*"
# lpdwOwnerSize : DWORD* in/out -> "void*"
# pPrimaryGroup : PSID optional, out -> "void*"
# lpdwPrimaryGroupSize : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。