Win32 API 日本語リファレンス
ホーム › Networking.ActiveDirectory › DsAddSidHistoryW

DsAddSidHistoryW

関数
移行元プリンシパルのSIDを移行先のSID履歴に追加する。
DLLNTDSAPI.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows Vista 以降

シグネチャ

// NTDSAPI.dll  (Unicode / -W)
#include <windows.h>

DWORD DsAddSidHistoryW(
    HANDLE hDS,
    DWORD Flags,   // optional
    LPCWSTR SrcDomain,
    LPCWSTR SrcPrincipal,
    LPCWSTR SrcDomainController,   // optional
    void* SrcDomainCreds,   // optional
    LPCWSTR DstDomain,
    LPCWSTR DstPrincipal
);

パラメーター

名前型方向説明
hDSHANDLEinDSBind 関数または DSBindWithCred 関数から取得したディレクトリサービスハンドルを格納します。
FlagsDWORDoptional将来の使用のために予約されています。NULL を設定してください。
SrcDomainLPCWSTRin

SrcPrincipal の SID を照会する対象のドメイン名を指定する、null で終わる文字列へのポインターです。

ソースドメインが Windows Server オペレーティングシステムで動作している場合、SrcDomain には fabrikam.com のようなドメインネームシステム (DNS) 名、または Fabrikam のようなフラットな NetBIOS 名のいずれかを指定できます。可能な場合は DNS 名を使用してください。

SrcPrincipalLPCWSTRinソースドメイン内のセキュリティプリンシパル (ユーザーまたはグループ) の名前を指定する、null で終わる文字列へのポインターです。この名前は、ドメイン相対の Security Account Manager (SAM) 名です。例: evacorets。
SrcDomainControllerLPCWSTRinoptional

ソースプリンシパルの SID の安全な取得と監査の生成に使用する、ソースドメイン内のプライマリドメインコントローラー (PDC) エミュレーターの名前を指定する、null で終わる文字列へのポインターです。

このパラメーターが NULL の場合、DSBindWithCred がプライマリドメインコントローラーを選択します。

SrcDomainController には DNS 名またはフラットな NetBIOS 名のいずれかを指定できます。可能な場合は DNS 名を使用してください。

SrcDomainCredsvoid*inoptional

ソースドメインで管理者権限を持つユーザーの ID と資格情報を表す ID ハンドルを格納します。このハンドルを取得するには、DsMakePasswordCredentials を呼び出します。このユーザーは、Administrators グループまたは Domain Administrators グループのいずれかのメンバーである必要があります。この呼び出しをリモートコンピューターから宛先 DC に対して行う場合、資格情報をプライバシー保護するために、リモートコンピューターと宛先 DC の両方が 128 ビット暗号化をサポートしている必要があります。128 ビット暗号化が利用できず、かつ SrcDomainCreds が指定されている場合、この呼び出しは宛先 DC 上で行う必要があります。

このパラメーターが NULL の場合、ソースドメインへのアクセスには呼び出し元の資格情報が使用されます。

DstDomainLPCWSTRinDstPrincipal が存在する宛先ドメインの名前を指定する、null で終わる文字列へのポインターです。この名前には、fabrikam.com のような DNS 名、または Fabrikam のような NetBIOS 名のいずれかを指定できます。宛先ドメインは Windows 2000 ネイティブモードで動作している必要があります。
DstPrincipalLPCWSTRin宛先ドメイン内のセキュリティプリンシパル (ユーザーまたはグループ) の名前を指定する、null で終わる文字列へのポインターです。このドメイン相対の SAM 名は、sIDHistory 属性が SrcPrincipal の SID で更新されるプリンシパルを識別します。

戻り値の型: DWORD

公式ドキュメント

あるドメイン内のセキュリティプリンシパルのプライマリアカウントのセキュリティ識別子 (SID) を取得し、別のフォレストにある異なるドメイン内のセキュリティプリンシパルの sIDHistory 属性に追加します。(Unicode)

戻り値

次のものを含む Win32 エラーコードを返します。

解説(Remarks)

メモ

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

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

各言語での呼び出し定義

// NTDSAPI.dll  (Unicode / -W)
#include <windows.h>

DWORD DsAddSidHistoryW(
    HANDLE hDS,
    DWORD Flags,   // optional
    LPCWSTR SrcDomain,
    LPCWSTR SrcPrincipal,
    LPCWSTR SrcDomainController,   // optional
    void* SrcDomainCreds,   // optional
    LPCWSTR DstDomain,
    LPCWSTR DstPrincipal
);
[DllImport("NTDSAPI.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint DsAddSidHistoryW(
    IntPtr hDS,   // HANDLE
    uint Flags,   // DWORD optional
    [MarshalAs(UnmanagedType.LPWStr)] string SrcDomain,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string SrcPrincipal,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string SrcDomainController,   // LPCWSTR optional
    IntPtr SrcDomainCreds,   // void* optional
    [MarshalAs(UnmanagedType.LPWStr)] string DstDomain,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string DstPrincipal   // LPCWSTR
);
<DllImport("NTDSAPI.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function DsAddSidHistoryW(
    hDS As IntPtr,   ' HANDLE
    Flags As UInteger,   ' DWORD optional
    <MarshalAs(UnmanagedType.LPWStr)> SrcDomain As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> SrcPrincipal As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> SrcDomainController As String,   ' LPCWSTR optional
    SrcDomainCreds As IntPtr,   ' void* optional
    <MarshalAs(UnmanagedType.LPWStr)> DstDomain As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> DstPrincipal As String   ' LPCWSTR
) As UInteger
End Function
' hDS : HANDLE
' Flags : DWORD optional
' SrcDomain : LPCWSTR
' SrcPrincipal : LPCWSTR
' SrcDomainController : LPCWSTR optional
' SrcDomainCreds : void* optional
' DstDomain : LPCWSTR
' DstPrincipal : LPCWSTR
Declare PtrSafe Function DsAddSidHistoryW Lib "ntdsapi" ( _
    ByVal hDS As LongPtr, _
    ByVal Flags As Long, _
    ByVal SrcDomain As LongPtr, _
    ByVal SrcPrincipal As LongPtr, _
    ByVal SrcDomainController As LongPtr, _
    ByVal SrcDomainCreds As LongPtr, _
    ByVal DstDomain As LongPtr, _
    ByVal DstPrincipal As LongPtr) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DsAddSidHistoryW = ctypes.windll.ntdsapi.DsAddSidHistoryW
DsAddSidHistoryW.restype = wintypes.DWORD
DsAddSidHistoryW.argtypes = [
    wintypes.HANDLE,  # hDS : HANDLE
    wintypes.DWORD,  # Flags : DWORD optional
    wintypes.LPCWSTR,  # SrcDomain : LPCWSTR
    wintypes.LPCWSTR,  # SrcPrincipal : LPCWSTR
    wintypes.LPCWSTR,  # SrcDomainController : LPCWSTR optional
    ctypes.POINTER(None),  # SrcDomainCreds : void* optional
    wintypes.LPCWSTR,  # DstDomain : LPCWSTR
    wintypes.LPCWSTR,  # DstPrincipal : LPCWSTR
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('NTDSAPI.dll')
DsAddSidHistoryW = Fiddle::Function.new(
  lib['DsAddSidHistoryW'],
  [
    Fiddle::TYPE_VOIDP,  # hDS : HANDLE
    -Fiddle::TYPE_INT,  # Flags : DWORD optional
    Fiddle::TYPE_VOIDP,  # SrcDomain : LPCWSTR
    Fiddle::TYPE_VOIDP,  # SrcPrincipal : LPCWSTR
    Fiddle::TYPE_VOIDP,  # SrcDomainController : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # SrcDomainCreds : void* optional
    Fiddle::TYPE_VOIDP,  # DstDomain : LPCWSTR
    Fiddle::TYPE_VOIDP,  # DstPrincipal : LPCWSTR
  ],
  -Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "ntdsapi")]
extern "system" {
    fn DsAddSidHistoryW(
        hDS: *mut core::ffi::c_void,  // HANDLE
        Flags: u32,  // DWORD optional
        SrcDomain: *const u16,  // LPCWSTR
        SrcPrincipal: *const u16,  // LPCWSTR
        SrcDomainController: *const u16,  // LPCWSTR optional
        SrcDomainCreds: *mut (),  // void* optional
        DstDomain: *const u16,  // LPCWSTR
        DstPrincipal: *const u16  // LPCWSTR
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("NTDSAPI.dll", CharSet = CharSet.Unicode)]
public static extern uint DsAddSidHistoryW(IntPtr hDS, uint Flags, [MarshalAs(UnmanagedType.LPWStr)] string SrcDomain, [MarshalAs(UnmanagedType.LPWStr)] string SrcPrincipal, [MarshalAs(UnmanagedType.LPWStr)] string SrcDomainController, IntPtr SrcDomainCreds, [MarshalAs(UnmanagedType.LPWStr)] string DstDomain, [MarshalAs(UnmanagedType.LPWStr)] string DstPrincipal);
"@
$api = Add-Type -MemberDefinition $sig -Name 'NTDSAPI_DsAddSidHistoryW' -Namespace Win32 -PassThru
# $api::DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
#uselib "NTDSAPI.dll"
#func global DsAddSidHistoryW "DsAddSidHistoryW" wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr
; DsAddSidHistoryW hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal   ; 戻り値は stat
; hDS : HANDLE -> "wptr"
; Flags : DWORD optional -> "wptr"
; SrcDomain : LPCWSTR -> "wptr"
; SrcPrincipal : LPCWSTR -> "wptr"
; SrcDomainController : LPCWSTR optional -> "wptr"
; SrcDomainCreds : void* optional -> "wptr"
; DstDomain : LPCWSTR -> "wptr"
; DstPrincipal : LPCWSTR -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "NTDSAPI.dll"
#cfunc global DsAddSidHistoryW "DsAddSidHistoryW" sptr, int, wstr, wstr, wstr, sptr, wstr, wstr
; res = DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
; hDS : HANDLE -> "sptr"
; Flags : DWORD optional -> "int"
; SrcDomain : LPCWSTR -> "wstr"
; SrcPrincipal : LPCWSTR -> "wstr"
; SrcDomainController : LPCWSTR optional -> "wstr"
; SrcDomainCreds : void* optional -> "sptr"
; DstDomain : LPCWSTR -> "wstr"
; DstPrincipal : LPCWSTR -> "wstr"
; DWORD DsAddSidHistoryW(HANDLE hDS, DWORD Flags, LPCWSTR SrcDomain, LPCWSTR SrcPrincipal, LPCWSTR SrcDomainController, void* SrcDomainCreds, LPCWSTR DstDomain, LPCWSTR DstPrincipal)
#uselib "NTDSAPI.dll"
#cfunc global DsAddSidHistoryW "DsAddSidHistoryW" intptr, int, wstr, wstr, wstr, intptr, wstr, wstr
; res = DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
; hDS : HANDLE -> "intptr"
; Flags : DWORD optional -> "int"
; SrcDomain : LPCWSTR -> "wstr"
; SrcPrincipal : LPCWSTR -> "wstr"
; SrcDomainController : LPCWSTR optional -> "wstr"
; SrcDomainCreds : void* optional -> "intptr"
; DstDomain : LPCWSTR -> "wstr"
; DstPrincipal : LPCWSTR -> "wstr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ntdsapi = windows.NewLazySystemDLL("NTDSAPI.dll")
	procDsAddSidHistoryW = ntdsapi.NewProc("DsAddSidHistoryW")
)

// hDS (HANDLE), Flags (DWORD optional), SrcDomain (LPCWSTR), SrcPrincipal (LPCWSTR), SrcDomainController (LPCWSTR optional), SrcDomainCreds (void* optional), DstDomain (LPCWSTR), DstPrincipal (LPCWSTR)
r1, _, err := procDsAddSidHistoryW.Call(
	uintptr(hDS),
	uintptr(Flags),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(SrcDomain))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(SrcPrincipal))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(SrcDomainController))),
	uintptr(SrcDomainCreds),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(DstDomain))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(DstPrincipal))),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function DsAddSidHistoryW(
  hDS: THandle;   // HANDLE
  Flags: DWORD;   // DWORD optional
  SrcDomain: PWideChar;   // LPCWSTR
  SrcPrincipal: PWideChar;   // LPCWSTR
  SrcDomainController: PWideChar;   // LPCWSTR optional
  SrcDomainCreds: Pointer;   // void* optional
  DstDomain: PWideChar;   // LPCWSTR
  DstPrincipal: PWideChar   // LPCWSTR
): DWORD; stdcall;
  external 'NTDSAPI.dll' name 'DsAddSidHistoryW';
result := DllCall("NTDSAPI\DsAddSidHistoryW"
    , "Ptr", hDS   ; HANDLE
    , "UInt", Flags   ; DWORD optional
    , "WStr", SrcDomain   ; LPCWSTR
    , "WStr", SrcPrincipal   ; LPCWSTR
    , "WStr", SrcDomainController   ; LPCWSTR optional
    , "Ptr", SrcDomainCreds   ; void* optional
    , "WStr", DstDomain   ; LPCWSTR
    , "WStr", DstPrincipal   ; LPCWSTR
    , "UInt")   ; return: DWORD
●DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal) = DLL("NTDSAPI.dll", "dword DsAddSidHistoryW(void*, dword, char*, char*, char*, void*, char*, char*)")
# 呼び出し: DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
# hDS : HANDLE -> "void*"
# Flags : DWORD optional -> "dword"
# SrcDomain : LPCWSTR -> "char*"
# SrcPrincipal : LPCWSTR -> "char*"
# SrcDomainController : LPCWSTR optional -> "char*"
# SrcDomainCreds : void* optional -> "void*"
# DstDomain : LPCWSTR -> "char*"
# DstPrincipal : LPCWSTR -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "ntdsapi" fn DsAddSidHistoryW(
    hDS: ?*anyopaque, // HANDLE
    Flags: u32, // DWORD optional
    SrcDomain: [*c]const u16, // LPCWSTR
    SrcPrincipal: [*c]const u16, // LPCWSTR
    SrcDomainController: [*c]const u16, // LPCWSTR optional
    SrcDomainCreds: ?*anyopaque, // void* optional
    DstDomain: [*c]const u16, // LPCWSTR
    DstPrincipal: [*c]const u16 // LPCWSTR
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc DsAddSidHistoryW(
    hDS: pointer,  # HANDLE
    Flags: uint32,  # DWORD optional
    SrcDomain: WideCString,  # LPCWSTR
    SrcPrincipal: WideCString,  # LPCWSTR
    SrcDomainController: WideCString,  # LPCWSTR optional
    SrcDomainCreds: pointer,  # void* optional
    DstDomain: WideCString,  # LPCWSTR
    DstPrincipal: WideCString  # LPCWSTR
): uint32 {.importc: "DsAddSidHistoryW", stdcall, dynlib: "NTDSAPI.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "ntdsapi");
extern(Windows)
uint DsAddSidHistoryW(
    void* hDS,   // HANDLE
    uint Flags,   // DWORD optional
    const(wchar)* SrcDomain,   // LPCWSTR
    const(wchar)* SrcPrincipal,   // LPCWSTR
    const(wchar)* SrcDomainController,   // LPCWSTR optional
    void* SrcDomainCreds,   // void* optional
    const(wchar)* DstDomain,   // LPCWSTR
    const(wchar)* DstPrincipal   // LPCWSTR
);
ccall((:DsAddSidHistoryW, "NTDSAPI.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, UInt32, Cwstring, Cwstring, Cwstring, Ptr{Cvoid}, Cwstring, Cwstring),
      hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
# hDS : HANDLE -> Ptr{Cvoid}
# Flags : DWORD optional -> UInt32
# SrcDomain : LPCWSTR -> Cwstring
# SrcPrincipal : LPCWSTR -> Cwstring
# SrcDomainController : LPCWSTR optional -> Cwstring
# SrcDomainCreds : void* optional -> Ptr{Cvoid}
# DstDomain : LPCWSTR -> Cwstring
# DstPrincipal : LPCWSTR -> Cwstring
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
uint32_t DsAddSidHistoryW(
    void* hDS,
    uint32_t Flags,
    const uint16_t* SrcDomain,
    const uint16_t* SrcPrincipal,
    const uint16_t* SrcDomainController,
    void* SrcDomainCreds,
    const uint16_t* DstDomain,
    const uint16_t* DstPrincipal);
]]
local ntdsapi = ffi.load("ntdsapi")
-- ntdsapi.DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
-- hDS : HANDLE
-- Flags : DWORD optional
-- SrcDomain : LPCWSTR
-- SrcPrincipal : LPCWSTR
-- SrcDomainController : LPCWSTR optional
-- SrcDomainCreds : void* optional
-- DstDomain : LPCWSTR
-- DstPrincipal : LPCWSTR
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('NTDSAPI.dll');
const DsAddSidHistoryW = lib.func('__stdcall', 'DsAddSidHistoryW', 'uint32_t', ['void *', 'uint32_t', 'str16', 'str16', 'str16', 'void *', 'str16', 'str16']);
// DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
// hDS : HANDLE -> 'void *'
// Flags : DWORD optional -> 'uint32_t'
// SrcDomain : LPCWSTR -> 'str16'
// SrcPrincipal : LPCWSTR -> 'str16'
// SrcDomainController : LPCWSTR optional -> 'str16'
// SrcDomainCreds : void* optional -> 'void *'
// DstDomain : LPCWSTR -> 'str16'
// DstPrincipal : LPCWSTR -> 'str16'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("NTDSAPI.dll", {
  DsAddSidHistoryW: { parameters: ["pointer", "u32", "buffer", "buffer", "buffer", "pointer", "buffer", "buffer"], result: "u32" },
});
// lib.symbols.DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal)
// hDS : HANDLE -> "pointer"
// Flags : DWORD optional -> "u32"
// SrcDomain : LPCWSTR -> "buffer"
// SrcPrincipal : LPCWSTR -> "buffer"
// SrcDomainController : LPCWSTR optional -> "buffer"
// SrcDomainCreds : void* optional -> "pointer"
// DstDomain : LPCWSTR -> "buffer"
// DstPrincipal : LPCWSTR -> "buffer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t DsAddSidHistoryW(
    void* hDS,
    uint32_t Flags,
    const uint16_t* SrcDomain,
    const uint16_t* SrcPrincipal,
    const uint16_t* SrcDomainController,
    void* SrcDomainCreds,
    const uint16_t* DstDomain,
    const uint16_t* DstPrincipal);
C, "NTDSAPI.dll");
// $ffi->DsAddSidHistoryW(hDS, Flags, SrcDomain, SrcPrincipal, SrcDomainController, SrcDomainCreds, DstDomain, DstPrincipal);
// hDS : HANDLE
// Flags : DWORD optional
// SrcDomain : LPCWSTR
// SrcPrincipal : LPCWSTR
// SrcDomainController : LPCWSTR optional
// SrcDomainCreds : void* optional
// DstDomain : LPCWSTR
// DstPrincipal : LPCWSTR
// 構造体/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 Ntdsapi extends StdCallLibrary {
    Ntdsapi INSTANCE = Native.load("ntdsapi", Ntdsapi.class, W32APIOptions.UNICODE_OPTIONS);
    int DsAddSidHistoryW(
        Pointer hDS,   // HANDLE
        int Flags,   // DWORD optional
        WString SrcDomain,   // LPCWSTR
        WString SrcPrincipal,   // LPCWSTR
        WString SrcDomainController,   // LPCWSTR optional
        Pointer SrcDomainCreds,   // void* optional
        WString DstDomain,   // LPCWSTR
        WString DstPrincipal   // LPCWSTR
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("ntdsapi")]
lib LibNTDSAPI
  fun DsAddSidHistoryW = DsAddSidHistoryW(
    hDS : Void*,   # HANDLE
    Flags : UInt32,   # DWORD optional
    SrcDomain : UInt16*,   # LPCWSTR
    SrcPrincipal : UInt16*,   # LPCWSTR
    SrcDomainController : UInt16*,   # LPCWSTR optional
    SrcDomainCreds : Void*,   # void* optional
    DstDomain : UInt16*,   # LPCWSTR
    DstPrincipal : UInt16*   # LPCWSTR
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef DsAddSidHistoryWNative = Uint32 Function(Pointer<Void>, Uint32, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>);
typedef DsAddSidHistoryWDart = int Function(Pointer<Void>, int, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>);
final DsAddSidHistoryW = DynamicLibrary.open('NTDSAPI.dll')
    .lookupFunction<DsAddSidHistoryWNative, DsAddSidHistoryWDart>('DsAddSidHistoryW');
// hDS : HANDLE -> Pointer<Void>
// Flags : DWORD optional -> Uint32
// SrcDomain : LPCWSTR -> Pointer<Utf16>
// SrcPrincipal : LPCWSTR -> Pointer<Utf16>
// SrcDomainController : LPCWSTR optional -> Pointer<Utf16>
// SrcDomainCreds : void* optional -> Pointer<Void>
// DstDomain : LPCWSTR -> Pointer<Utf16>
// DstPrincipal : LPCWSTR -> Pointer<Utf16>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DsAddSidHistoryW(
  hDS: THandle;   // HANDLE
  Flags: DWORD;   // DWORD optional
  SrcDomain: PWideChar;   // LPCWSTR
  SrcPrincipal: PWideChar;   // LPCWSTR
  SrcDomainController: PWideChar;   // LPCWSTR optional
  SrcDomainCreds: Pointer;   // void* optional
  DstDomain: PWideChar;   // LPCWSTR
  DstPrincipal: PWideChar   // LPCWSTR
): DWORD; stdcall;
  external 'NTDSAPI.dll' name 'DsAddSidHistoryW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DsAddSidHistoryW"
  c_DsAddSidHistoryW :: Ptr () -> Word32 -> CWString -> CWString -> CWString -> Ptr () -> CWString -> CWString -> IO Word32
-- hDS : HANDLE -> Ptr ()
-- Flags : DWORD optional -> Word32
-- SrcDomain : LPCWSTR -> CWString
-- SrcPrincipal : LPCWSTR -> CWString
-- SrcDomainController : LPCWSTR optional -> CWString
-- SrcDomainCreds : void* optional -> Ptr ()
-- DstDomain : LPCWSTR -> CWString
-- DstPrincipal : LPCWSTR -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let dsaddsidhistoryw =
  foreign "DsAddSidHistoryW"
    ((ptr void) @-> uint32_t @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr void) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> returning uint32_t)
(* hDS : HANDLE -> (ptr void) *)
(* Flags : DWORD optional -> uint32_t *)
(* SrcDomain : LPCWSTR -> (ptr uint16_t) *)
(* SrcPrincipal : LPCWSTR -> (ptr uint16_t) *)
(* SrcDomainController : LPCWSTR optional -> (ptr uint16_t) *)
(* SrcDomainCreds : void* optional -> (ptr void) *)
(* DstDomain : LPCWSTR -> (ptr uint16_t) *)
(* DstPrincipal : LPCWSTR -> (ptr uint16_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ntdsapi (t "NTDSAPI.dll"))
(cffi:use-foreign-library ntdsapi)

(cffi:defcfun ("DsAddSidHistoryW" ds-add-sid-history-w :convention :stdcall) :uint32
  (h-ds :pointer)   ; HANDLE
  (flags :uint32)   ; DWORD optional
  (src-domain (:string :encoding :utf-16le))   ; LPCWSTR
  (src-principal (:string :encoding :utf-16le))   ; LPCWSTR
  (src-domain-controller (:string :encoding :utf-16le))   ; LPCWSTR optional
  (src-domain-creds :pointer)   ; void* optional
  (dst-domain (:string :encoding :utf-16le))   ; LPCWSTR
  (dst-principal (:string :encoding :utf-16le)))   ; LPCWSTR
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DsAddSidHistoryW = Win32::API::More->new('NTDSAPI',
    'DWORD DsAddSidHistoryW(HANDLE hDS, DWORD Flags, LPCWSTR SrcDomain, LPCWSTR SrcPrincipal, LPCWSTR SrcDomainController, LPVOID SrcDomainCreds, LPCWSTR DstDomain, LPCWSTR DstPrincipal)');
# my $ret = $DsAddSidHistoryW->Call($hDS, $Flags, $SrcDomain, $SrcPrincipal, $SrcDomainController, $SrcDomainCreds, $DstDomain, $DstPrincipal);
# hDS : HANDLE -> HANDLE
# Flags : DWORD optional -> DWORD
# SrcDomain : LPCWSTR -> LPCWSTR
# SrcPrincipal : LPCWSTR -> LPCWSTR
# SrcDomainController : LPCWSTR optional -> LPCWSTR
# SrcDomainCreds : void* optional -> LPVOID
# DstDomain : LPCWSTR -> LPCWSTR
# DstPrincipal : LPCWSTR -> LPCWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
公式の関連項目