MakeAbsoluteSD
関数自己相対形式のセキュリティ記述子を絶対形式に変換する。
シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 |
|---|---|---|
| pSelfRelativeSecurityDescriptor | PSECURITY_DESCRIPTOR | in |
| pAbsoluteSecurityDescriptor | PSECURITY_DESCRIPTOR | outoptional |
| lpdwAbsoluteSecurityDescriptorSize | DWORD* | inout |
| pDacl | ACL* | outoptional |
| lpdwDaclSize | DWORD* | inout |
| pSacl | ACL* | outoptional |
| lpdwSaclSize | DWORD* | inout |
| pOwner | PSID | outoptional |
| lpdwOwnerSize | DWORD* | inout |
| pPrimaryGroup | PSID | outoptional |
| lpdwPrimaryGroupSize | DWORD* | 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 方式にも切替可。#uselib "ADVAPI32.dll" #cfunc global MakeAbsoluteSD "MakeAbsoluteSD" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr ; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, varptr(lpdwAbsoluteSecurityDescriptorSize), varptr(pDacl), varptr(lpdwDaclSize), varptr(pSacl), varptr(lpdwSaclSize), pOwner, varptr(lpdwOwnerSize), pPrimaryGroup, varptr(lpdwPrimaryGroupSize)) ; 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" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr ; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, varptr(lpdwAbsoluteSecurityDescriptorSize), varptr(pDacl), varptr(lpdwDaclSize), varptr(pSacl), varptr(lpdwSaclSize), pOwner, varptr(lpdwOwnerSize), pPrimaryGroup, varptr(lpdwPrimaryGroupSize)) ; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "intptr" ; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "intptr" ; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "intptr" ; pDacl : ACL* optional, out -> "intptr" ; lpdwDaclSize : DWORD* in/out -> "intptr" ; pSacl : ACL* optional, out -> "intptr" ; lpdwSaclSize : DWORD* in/out -> "intptr" ; pOwner : PSID optional, out -> "intptr" ; lpdwOwnerSize : DWORD* in/out -> "intptr" ; pPrimaryGroup : PSID optional, out -> "intptr" ; lpdwPrimaryGroupSize : DWORD* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // BOOLfunction 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)。