Win32 API 日本語リファレンス
ホームNetworkManagement.NetManagement › NetLocalGroupEnum

NetLocalGroupEnum

関数
サーバー上のローカルグループを列挙する。
DLLNETAPI32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

DWORD NetLocalGroupEnum(
    LPCWSTR servername,   // optional
    DWORD level,
    BYTE** bufptr,
    DWORD prefmaxlen,
    DWORD* entriesread,
    DWORD* totalentries,
    UINT_PTR* resumehandle   // optional
);

パラメーター

名前方向説明
servernameLPCWSTRinoptional関数を実行するリモートサーバーの DNS 名または NetBIOS 名を指定する定数文字列へのポインター。このパラメーターが NULL の場合、ローカルコンピューターが使用されます。
levelDWORDin

データの情報レベルを指定します。このパラメーターには次のいずれかの値を指定できます。

Value Meaning
0
ローカルグループ名を返します。bufptr パラメーターは LOCALGROUP_INFO_0 構造体の配列を指します。
1
ローカルグループ名と、各グループに関連付けられたコメントを返します。bufptr パラメーターは LOCALGROUP_INFO_1 構造体の配列を指します。
bufptrBYTE**out情報構造体を受け取るバッファーのアドレスへのポインター。このデータの形式は level パラメーターの値によって異なります。このバッファーはシステムによって割り当てられ、 NetApiBufferFree 関数を使用して解放する必要があります。関数が ERROR_MORE_DATA で失敗した場合でも、バッファーを解放する必要があることに注意してください。
prefmaxlenDWORDin返されるデータの推奨される最大長をバイト単位で指定します。MAX_PREFERRED_LENGTH を指定すると、関数はデータに必要なメモリ量を割り当てます。このパラメーターに別の値を指定すると、関数が返すバイト数を制限できます。バッファーサイズがすべてのエントリを保持するのに不十分な場合、関数は ERROR_MORE_DATA を返します。詳細については、 Network Management Function Buffers および Network Management Function Buffer Lengths を参照してください。
entriesreadDWORD*out実際に列挙された要素の数を受け取る値へのポインター。
totalentriesDWORD*out現在の再開位置から列挙できたであろうエントリの概算合計数を受け取る値へのポインター。エントリの合計数はあくまで目安です。正確なエントリ数の判定方法の詳細については、次の「Remarks」セクションを参照してください。
resumehandleUINT_PTR*inoutoptional既存のローカルグループ検索を継続するために使用される再開ハンドルを格納する値へのポインター。このハンドルは最初の呼び出しではゼロにし、後続の呼び出しでは変更せずにそのままにする必要があります。このパラメーターが NULL の場合、再開ハンドルは格納されません。詳細については、次の「Remarks」セクションを参照してください。

戻り値の型: DWORD

公式ドキュメント

NetLocalGroupEnum 関数は、指定したサーバー上の各ローカルグループアカウントに関する情報を返します。

戻り値

関数が成功した場合、戻り値は NERR_Success です。

関数が失敗した場合、戻り値は次のいずれかのエラーコードになります。

Return code Description
ERROR_ACCESS_DENIED
ユーザーは要求された情報へのアクセス権を持っていません。
ERROR_MORE_DATA
さらにエントリが存在します。すべてのエントリを受け取るのに十分な大きさのバッファーを指定してください。
NERR_InvalidComputer
コンピューター名が無効です。
NERR_BufTooSmall
戻りバッファーが小さすぎます。

解説(Remarks)

Active Directory を実行しているドメインコントローラー上でこの関数を呼び出す場合、アクセスは securable object のアクセス制御リスト (ACL) に基づいて許可または拒否されます。既定の ACL では、すべての認証済みユーザーおよび「Pre-Windows 2000 compatible access」グループのメンバーが情報を表示できます。メンバーサーバーまたはワークステーション上でこの関数を呼び出す場合、すべての認証済みユーザーが情報を表示できます。これらのプラットフォームにおける匿名アクセスおよび匿名アクセスの制限についての情報は、 Security Requirements for the Network Management Functions を参照してください。ACL、ACE、およびアクセストークンの詳細については、 Access Control Model を参照してください。

この関数は、呼び出し元が Read アクセス権を持つ情報のみを返します。呼び出し元は Domain オブジェクトに対する List Contents アクセス権、および System コンテナー内にある SAM Server オブジェクトに対する Enumerate Entire SAM Domain アクセス権を持っている必要があります。

ローカルグループの正確な合計数を判定するには、ツリー全体を列挙する必要があり、これはコストの高い操作になる場合があります。ツリー全体を列挙するには、resumehandle パラメーターを使用して連続する呼び出しで列挙を継続し、entriesread パラメーターを使用してローカルグループの合計数を累積します。アプリケーションがドメインコントローラーと通信している場合は、この種のデータをより効率的に取得するために ADSI LDAP Provider の使用を検討してください。ADSI LDAP Provider は、さまざまな ADSI インターフェイスをサポートする一連の ADSI オブジェクトを実装しています。詳細については、 ADSI Service Providers を参照してください。

ユーザーアカウント名は 20 文字までに制限され、グループ名は 256 文字までに制限されます。さらに、アカウント名はピリオドで終わることはできず、カンマや次の印字可能文字を含めることもできません: ", /, , [, ], :, |, <, >, +, =, ;, ?, *。また、名前には非印字文字である 1〜31 の範囲の文字を含めることもできません。

Active Directory 向けにプログラミングしている場合、特定の Active Directory Service Interface (ADSI) メソッドを呼び出すことで、ネットワーク管理ローカルグループ関数を呼び出す場合と同じ機能を実現できることがあります。詳細については、 IADsGroup を参照してください。

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

各言語での呼び出し定義

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

DWORD NetLocalGroupEnum(
    LPCWSTR servername,   // optional
    DWORD level,
    BYTE** bufptr,
    DWORD prefmaxlen,
    DWORD* entriesread,
    DWORD* totalentries,
    UINT_PTR* resumehandle   // optional
);
[DllImport("NETAPI32.dll", ExactSpelling = true)]
static extern uint NetLocalGroupEnum(
    [MarshalAs(UnmanagedType.LPWStr)] string servername,   // LPCWSTR optional
    uint level,   // DWORD
    IntPtr bufptr,   // BYTE** out
    uint prefmaxlen,   // DWORD
    out uint entriesread,   // DWORD* out
    out uint totalentries,   // DWORD* out
    IntPtr resumehandle   // UINT_PTR* optional, in/out
);
<DllImport("NETAPI32.dll", ExactSpelling:=True)>
Public Shared Function NetLocalGroupEnum(
    <MarshalAs(UnmanagedType.LPWStr)> servername As String,   ' LPCWSTR optional
    level As UInteger,   ' DWORD
    bufptr As IntPtr,   ' BYTE** out
    prefmaxlen As UInteger,   ' DWORD
    <Out> ByRef entriesread As UInteger,   ' DWORD* out
    <Out> ByRef totalentries As UInteger,   ' DWORD* out
    resumehandle As IntPtr   ' UINT_PTR* optional, in/out
) As UInteger
End Function
' servername : LPCWSTR optional
' level : DWORD
' bufptr : BYTE** out
' prefmaxlen : DWORD
' entriesread : DWORD* out
' totalentries : DWORD* out
' resumehandle : UINT_PTR* optional, in/out
Declare PtrSafe Function NetLocalGroupEnum Lib "netapi32" ( _
    ByVal servername As LongPtr, _
    ByVal level As Long, _
    ByVal bufptr As LongPtr, _
    ByVal prefmaxlen As Long, _
    ByRef entriesread As Long, _
    ByRef totalentries As Long, _
    ByVal resumehandle As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

NetLocalGroupEnum = ctypes.windll.netapi32.NetLocalGroupEnum
NetLocalGroupEnum.restype = wintypes.DWORD
NetLocalGroupEnum.argtypes = [
    wintypes.LPCWSTR,  # servername : LPCWSTR optional
    wintypes.DWORD,  # level : DWORD
    ctypes.c_void_p,  # bufptr : BYTE** out
    wintypes.DWORD,  # prefmaxlen : DWORD
    ctypes.POINTER(wintypes.DWORD),  # entriesread : DWORD* out
    ctypes.POINTER(wintypes.DWORD),  # totalentries : DWORD* out
    ctypes.POINTER(ctypes.c_size_t),  # resumehandle : UINT_PTR* optional, in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('NETAPI32.dll')
NetLocalGroupEnum = Fiddle::Function.new(
  lib['NetLocalGroupEnum'],
  [
    Fiddle::TYPE_VOIDP,  # servername : LPCWSTR optional
    -Fiddle::TYPE_INT,  # level : DWORD
    Fiddle::TYPE_VOIDP,  # bufptr : BYTE** out
    -Fiddle::TYPE_INT,  # prefmaxlen : DWORD
    Fiddle::TYPE_VOIDP,  # entriesread : DWORD* out
    Fiddle::TYPE_VOIDP,  # totalentries : DWORD* out
    Fiddle::TYPE_VOIDP,  # resumehandle : UINT_PTR* optional, in/out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "netapi32")]
extern "system" {
    fn NetLocalGroupEnum(
        servername: *const u16,  // LPCWSTR optional
        level: u32,  // DWORD
        bufptr: *mut *mut u8,  // BYTE** out
        prefmaxlen: u32,  // DWORD
        entriesread: *mut u32,  // DWORD* out
        totalentries: *mut u32,  // DWORD* out
        resumehandle: *mut usize  // UINT_PTR* optional, in/out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("NETAPI32.dll")]
public static extern uint NetLocalGroupEnum([MarshalAs(UnmanagedType.LPWStr)] string servername, uint level, IntPtr bufptr, uint prefmaxlen, out uint entriesread, out uint totalentries, IntPtr resumehandle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'NETAPI32_NetLocalGroupEnum' -Namespace Win32 -PassThru
# $api::NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
#uselib "NETAPI32.dll"
#func global NetLocalGroupEnum "NetLocalGroupEnum" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; NetLocalGroupEnum servername, level, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resumehandle)   ; 戻り値は stat
; servername : LPCWSTR optional -> "sptr"
; level : DWORD -> "sptr"
; bufptr : BYTE** out -> "sptr"
; prefmaxlen : DWORD -> "sptr"
; entriesread : DWORD* out -> "sptr"
; totalentries : DWORD* out -> "sptr"
; resumehandle : UINT_PTR* optional, in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "NETAPI32.dll"
#cfunc global NetLocalGroupEnum "NetLocalGroupEnum" wstr, int, var, int, var, var, var
; res = NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
; servername : LPCWSTR optional -> "wstr"
; level : DWORD -> "int"
; bufptr : BYTE** out -> "var"
; prefmaxlen : DWORD -> "int"
; entriesread : DWORD* out -> "var"
; totalentries : DWORD* out -> "var"
; resumehandle : UINT_PTR* optional, in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD NetLocalGroupEnum(LPCWSTR servername, DWORD level, BYTE** bufptr, DWORD prefmaxlen, DWORD* entriesread, DWORD* totalentries, UINT_PTR* resumehandle)
#uselib "NETAPI32.dll"
#cfunc global NetLocalGroupEnum "NetLocalGroupEnum" wstr, int, var, int, var, var, var
; res = NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
; servername : LPCWSTR optional -> "wstr"
; level : DWORD -> "int"
; bufptr : BYTE** out -> "var"
; prefmaxlen : DWORD -> "int"
; entriesread : DWORD* out -> "var"
; totalentries : DWORD* out -> "var"
; resumehandle : UINT_PTR* optional, in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	netapi32 = windows.NewLazySystemDLL("NETAPI32.dll")
	procNetLocalGroupEnum = netapi32.NewProc("NetLocalGroupEnum")
)

// servername (LPCWSTR optional), level (DWORD), bufptr (BYTE** out), prefmaxlen (DWORD), entriesread (DWORD* out), totalentries (DWORD* out), resumehandle (UINT_PTR* optional, in/out)
r1, _, err := procNetLocalGroupEnum.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(servername))),
	uintptr(level),
	uintptr(bufptr),
	uintptr(prefmaxlen),
	uintptr(entriesread),
	uintptr(totalentries),
	uintptr(resumehandle),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function NetLocalGroupEnum(
  servername: PWideChar;   // LPCWSTR optional
  level: DWORD;   // DWORD
  bufptr: Pointer;   // BYTE** out
  prefmaxlen: DWORD;   // DWORD
  entriesread: Pointer;   // DWORD* out
  totalentries: Pointer;   // DWORD* out
  resumehandle: Pointer   // UINT_PTR* optional, in/out
): DWORD; stdcall;
  external 'NETAPI32.dll' name 'NetLocalGroupEnum';
result := DllCall("NETAPI32\NetLocalGroupEnum"
    , "WStr", servername   ; LPCWSTR optional
    , "UInt", level   ; DWORD
    , "Ptr", bufptr   ; BYTE** out
    , "UInt", prefmaxlen   ; DWORD
    , "Ptr", entriesread   ; DWORD* out
    , "Ptr", totalentries   ; DWORD* out
    , "Ptr", resumehandle   ; UINT_PTR* optional, in/out
    , "UInt")   ; return: DWORD
●NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle) = DLL("NETAPI32.dll", "dword NetLocalGroupEnum(char*, dword, void*, dword, void*, void*, void*)")
# 呼び出し: NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
# servername : LPCWSTR optional -> "char*"
# level : DWORD -> "dword"
# bufptr : BYTE** out -> "void*"
# prefmaxlen : DWORD -> "dword"
# entriesread : DWORD* out -> "void*"
# totalentries : DWORD* out -> "void*"
# resumehandle : UINT_PTR* optional, in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "netapi32" fn NetLocalGroupEnum(
    servername: [*c]const u16, // LPCWSTR optional
    level: u32, // DWORD
    bufptr: [*c][*c]u8, // BYTE** out
    prefmaxlen: u32, // DWORD
    entriesread: [*c]u32, // DWORD* out
    totalentries: [*c]u32, // DWORD* out
    resumehandle: [*c]usize // UINT_PTR* optional, in/out
) callconv(std.os.windows.WINAPI) u32;
proc NetLocalGroupEnum(
    servername: WideCString,  # LPCWSTR optional
    level: uint32,  # DWORD
    bufptr: ptr uint8,  # BYTE** out
    prefmaxlen: uint32,  # DWORD
    entriesread: ptr uint32,  # DWORD* out
    totalentries: ptr uint32,  # DWORD* out
    resumehandle: ptr uint  # UINT_PTR* optional, in/out
): uint32 {.importc: "NetLocalGroupEnum", stdcall, dynlib: "NETAPI32.dll".}
pragma(lib, "netapi32");
extern(Windows)
uint NetLocalGroupEnum(
    const(wchar)* servername,   // LPCWSTR optional
    uint level,   // DWORD
    ubyte** bufptr,   // BYTE** out
    uint prefmaxlen,   // DWORD
    uint* entriesread,   // DWORD* out
    uint* totalentries,   // DWORD* out
    size_t* resumehandle   // UINT_PTR* optional, in/out
);
ccall((:NetLocalGroupEnum, "NETAPI32.dll"), stdcall, UInt32,
      (Cwstring, UInt32, Ptr{UInt8}, UInt32, Ptr{UInt32}, Ptr{UInt32}, Ptr{Csize_t}),
      servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
# servername : LPCWSTR optional -> Cwstring
# level : DWORD -> UInt32
# bufptr : BYTE** out -> Ptr{UInt8}
# prefmaxlen : DWORD -> UInt32
# entriesread : DWORD* out -> Ptr{UInt32}
# totalentries : DWORD* out -> Ptr{UInt32}
# resumehandle : UINT_PTR* optional, in/out -> Ptr{Csize_t}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t NetLocalGroupEnum(
    const uint16_t* servername,
    uint32_t level,
    uint8_t** bufptr,
    uint32_t prefmaxlen,
    uint32_t* entriesread,
    uint32_t* totalentries,
    uintptr_t* resumehandle);
]]
local netapi32 = ffi.load("netapi32")
-- netapi32.NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
-- servername : LPCWSTR optional
-- level : DWORD
-- bufptr : BYTE** out
-- prefmaxlen : DWORD
-- entriesread : DWORD* out
-- totalentries : DWORD* out
-- resumehandle : UINT_PTR* optional, in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('NETAPI32.dll');
const NetLocalGroupEnum = lib.func('__stdcall', 'NetLocalGroupEnum', 'uint32_t', ['str16', 'uint32_t', 'uint8_t *', 'uint32_t', 'uint32_t *', 'uint32_t *', 'uintptr_t *']);
// NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
// servername : LPCWSTR optional -> 'str16'
// level : DWORD -> 'uint32_t'
// bufptr : BYTE** out -> 'uint8_t *'
// prefmaxlen : DWORD -> 'uint32_t'
// entriesread : DWORD* out -> 'uint32_t *'
// totalentries : DWORD* out -> 'uint32_t *'
// resumehandle : UINT_PTR* optional, in/out -> 'uintptr_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("NETAPI32.dll", {
  NetLocalGroupEnum: { parameters: ["buffer", "u32", "pointer", "u32", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle)
// servername : LPCWSTR optional -> "buffer"
// level : DWORD -> "u32"
// bufptr : BYTE** out -> "pointer"
// prefmaxlen : DWORD -> "u32"
// entriesread : DWORD* out -> "pointer"
// totalentries : DWORD* out -> "pointer"
// resumehandle : UINT_PTR* optional, in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t NetLocalGroupEnum(
    const uint16_t* servername,
    uint32_t level,
    uint8_t** bufptr,
    uint32_t prefmaxlen,
    uint32_t* entriesread,
    uint32_t* totalentries,
    size_t* resumehandle);
C, "NETAPI32.dll");
// $ffi->NetLocalGroupEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle);
// servername : LPCWSTR optional
// level : DWORD
// bufptr : BYTE** out
// prefmaxlen : DWORD
// entriesread : DWORD* out
// totalentries : DWORD* out
// resumehandle : UINT_PTR* optional, in/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 Netapi32 extends StdCallLibrary {
    Netapi32 INSTANCE = Native.load("netapi32", Netapi32.class);
    int NetLocalGroupEnum(
        WString servername,   // LPCWSTR optional
        int level,   // DWORD
        Pointer bufptr,   // BYTE** out
        int prefmaxlen,   // DWORD
        IntByReference entriesread,   // DWORD* out
        IntByReference totalentries,   // DWORD* out
        LongByReference resumehandle   // UINT_PTR* optional, in/out
    );
}
@[Link("netapi32")]
lib LibNETAPI32
  fun NetLocalGroupEnum = NetLocalGroupEnum(
    servername : UInt16*,   # LPCWSTR optional
    level : UInt32,   # DWORD
    bufptr : UInt8**,   # BYTE** out
    prefmaxlen : UInt32,   # DWORD
    entriesread : UInt32*,   # DWORD* out
    totalentries : UInt32*,   # DWORD* out
    resumehandle : LibC::SizeT*   # UINT_PTR* optional, in/out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef NetLocalGroupEnumNative = Uint32 Function(Pointer<Utf16>, Uint32, Pointer<Uint8>, Uint32, Pointer<Uint32>, Pointer<Uint32>, Pointer<UintPtr>);
typedef NetLocalGroupEnumDart = int Function(Pointer<Utf16>, int, Pointer<Uint8>, int, Pointer<Uint32>, Pointer<Uint32>, Pointer<UintPtr>);
final NetLocalGroupEnum = DynamicLibrary.open('NETAPI32.dll')
    .lookupFunction<NetLocalGroupEnumNative, NetLocalGroupEnumDart>('NetLocalGroupEnum');
// servername : LPCWSTR optional -> Pointer<Utf16>
// level : DWORD -> Uint32
// bufptr : BYTE** out -> Pointer<Uint8>
// prefmaxlen : DWORD -> Uint32
// entriesread : DWORD* out -> Pointer<Uint32>
// totalentries : DWORD* out -> Pointer<Uint32>
// resumehandle : UINT_PTR* optional, in/out -> Pointer<UintPtr>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function NetLocalGroupEnum(
  servername: PWideChar;   // LPCWSTR optional
  level: DWORD;   // DWORD
  bufptr: Pointer;   // BYTE** out
  prefmaxlen: DWORD;   // DWORD
  entriesread: Pointer;   // DWORD* out
  totalentries: Pointer;   // DWORD* out
  resumehandle: Pointer   // UINT_PTR* optional, in/out
): DWORD; stdcall;
  external 'NETAPI32.dll' name 'NetLocalGroupEnum';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "NetLocalGroupEnum"
  c_NetLocalGroupEnum :: CWString -> Word32 -> Ptr Word8 -> Word32 -> Ptr Word32 -> Ptr Word32 -> Ptr CUIntPtr -> IO Word32
-- servername : LPCWSTR optional -> CWString
-- level : DWORD -> Word32
-- bufptr : BYTE** out -> Ptr Word8
-- prefmaxlen : DWORD -> Word32
-- entriesread : DWORD* out -> Ptr Word32
-- totalentries : DWORD* out -> Ptr Word32
-- resumehandle : UINT_PTR* optional, in/out -> Ptr CUIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let netlocalgroupenum =
  foreign "NetLocalGroupEnum"
    ((ptr uint16_t) @-> uint32_t @-> (ptr uint8_t) @-> uint32_t @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr size_t) @-> returning uint32_t)
(* servername : LPCWSTR optional -> (ptr uint16_t) *)
(* level : DWORD -> uint32_t *)
(* bufptr : BYTE** out -> (ptr uint8_t) *)
(* prefmaxlen : DWORD -> uint32_t *)
(* entriesread : DWORD* out -> (ptr uint32_t) *)
(* totalentries : DWORD* out -> (ptr uint32_t) *)
(* resumehandle : UINT_PTR* optional, in/out -> (ptr size_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library netapi32 (t "NETAPI32.dll"))
(cffi:use-foreign-library netapi32)

(cffi:defcfun ("NetLocalGroupEnum" net-local-group-enum :convention :stdcall) :uint32
  (servername (:string :encoding :utf-16le))   ; LPCWSTR optional
  (level :uint32)   ; DWORD
  (bufptr :pointer)   ; BYTE** out
  (prefmaxlen :uint32)   ; DWORD
  (entriesread :pointer)   ; DWORD* out
  (totalentries :pointer)   ; DWORD* out
  (resumehandle :pointer))   ; UINT_PTR* optional, in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $NetLocalGroupEnum = Win32::API::More->new('NETAPI32',
    'DWORD NetLocalGroupEnum(LPCWSTR servername, DWORD level, LPVOID bufptr, DWORD prefmaxlen, LPVOID entriesread, LPVOID totalentries, LPVOID resumehandle)');
# my $ret = $NetLocalGroupEnum->Call($servername, $level, $bufptr, $prefmaxlen, $entriesread, $totalentries, $resumehandle);
# servername : LPCWSTR optional -> LPCWSTR
# level : DWORD -> DWORD
# bufptr : BYTE** out -> LPVOID
# prefmaxlen : DWORD -> DWORD
# entriesread : DWORD* out -> LPVOID
# totalentries : DWORD* out -> LPVOID
# resumehandle : UINT_PTR* optional, in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目