NetLocalGroupEnum
関数シグネチャ
// NETAPI32.dll
#include <windows.h>
DWORD NetLocalGroupEnum(
LPCWSTR servername, // optional
DWORD level,
BYTE** bufptr,
DWORD prefmaxlen,
DWORD* entriesread,
DWORD* totalentries,
UINT_PTR* resumehandle // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| servername | LPCWSTR | inoptional | 関数を実行するリモートサーバーの DNS 名または NetBIOS 名を指定する定数文字列へのポインター。このパラメーターが NULL の場合、ローカルコンピューターが使用されます。 | ||||||
| level | DWORD | in | データの情報レベルを指定します。このパラメーターには次のいずれかの値を指定できます。
| ||||||
| bufptr | BYTE** | out | 情報構造体を受け取るバッファーのアドレスへのポインター。このデータの形式は level パラメーターの値によって異なります。このバッファーはシステムによって割り当てられ、 NetApiBufferFree 関数を使用して解放する必要があります。関数が ERROR_MORE_DATA で失敗した場合でも、バッファーを解放する必要があることに注意してください。 | ||||||
| prefmaxlen | DWORD | in | 返されるデータの推奨される最大長をバイト単位で指定します。MAX_PREFERRED_LENGTH を指定すると、関数はデータに必要なメモリ量を割り当てます。このパラメーターに別の値を指定すると、関数が返すバイト数を制限できます。バッファーサイズがすべてのエントリを保持するのに不十分な場合、関数は ERROR_MORE_DATA を返します。詳細については、 Network Management Function Buffers および Network Management Function Buffer Lengths を参照してください。 | ||||||
| entriesread | DWORD* | out | 実際に列挙された要素の数を受け取る値へのポインター。 | ||||||
| totalentries | DWORD* | out | 現在の再開位置から列挙できたであろうエントリの概算合計数を受け取る値へのポインター。エントリの合計数はあくまで目安です。正確なエントリ数の判定方法の詳細については、次の「Remarks」セクションを参照してください。 | ||||||
| resumehandle | UINT_PTR* | inoutoptional | 既存のローカルグループ検索を継続するために使用される再開ハンドルを格納する値へのポインター。このハンドルは最初の呼び出しではゼロにし、後続の呼び出しでは変更せずにそのままにする必要があります。このパラメーターが NULL の場合、再開ハンドルは格納されません。詳細については、次の「Remarks」セクションを参照してください。 |
戻り値の型: DWORD
公式ドキュメント
NetLocalGroupEnum 関数は、指定したサーバー上の各ローカルグループアカウントに関する情報を返します。
戻り値
関数が成功した場合、戻り値は NERR_Success です。
関数が失敗した場合、戻り値は次のいずれかのエラーコードになります。
| Return code | Description |
|---|---|
| ユーザーは要求された情報へのアクセス権を持っていません。 | |
| さらにエントリが存在します。すべてのエントリを受け取るのに十分な大きさのバッファーを指定してください。 | |
|
コンピューター名が無効です。 |
|
戻りバッファーが小さすぎます。 |
解説(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 公式リファレンス: 英語 (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 方式にも切替可。#uselib "NETAPI32.dll" #cfunc global NetLocalGroupEnum "NetLocalGroupEnum" wstr, int, sptr, int, sptr, sptr, sptr ; res = NetLocalGroupEnum(servername, level, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resumehandle)) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; bufptr : BYTE** out -> "sptr" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "sptr" ; totalentries : DWORD* out -> "sptr" ; resumehandle : UINT_PTR* optional, in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, int, intptr, intptr, intptr ; res = NetLocalGroupEnum(servername, level, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resumehandle)) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; bufptr : BYTE** out -> "intptr" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "intptr" ; totalentries : DWORD* out -> "intptr" ; resumehandle : UINT_PTR* optional, in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // DWORDfunction 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 を使用。関連項目
- s LOCALGROUP_INFO_0
- s LOCALGROUP_INFO_1
- f NetLocalGroupGetInfo — 指定したローカルグループの情報を取得する。
- f NetLocalGroupGetMembers — ローカルグループに所属するメンバーの一覧を取得する。
- f NetQueryDisplayInformation — ユーザーやグループの表示情報を高速に列挙する。