NetUserEnum
関数シグネチャ
// NETAPI32.dll
#include <windows.h>
DWORD NetUserEnum(
LPCWSTR servername, // optional
DWORD level,
NET_USER_ENUM_FILTER_FLAGS filter,
BYTE** bufptr,
DWORD prefmaxlen,
DWORD* entriesread,
DWORD* totalentries,
DWORD* resume_handle // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| servername | LPCWSTR | inoptional | 関数を実行するリモートサーバーの DNS 名または NetBIOS 名を指定する定数文字列へのポインターです。このパラメーターが NULL の場合、ローカルコンピューターが使用されます。 | ||||||||||||||||
| level | DWORD | in | データの情報レベルを指定します。このパラメーターには次のいずれかの値を指定できます。
| ||||||||||||||||
| filter | NET_USER_ENUM_FILTER_FLAGS | in | 列挙に含めるユーザーアカウントの種類を指定する値です。値がゼロの場合、すべての通常ユーザー、トラストデータ、およびマシンアカウントデータが含まれることを示します。 このパラメーターには、次の値の組み合わせを指定することもできます。 | ||||||||||||||||
| bufptr | BYTE** | out | データを受け取るバッファーへのポインターです。このデータの形式は level パラメーターの値によって異なります。 このデータのバッファーはシステムによって割り当てられます。返されたデータが不要になったら、アプリケーションは NetApiBufferFree 関数を呼び出して、割り当てられたメモリを解放する必要があります。なお、NetUserEnum 関数が ERROR_MORE_DATA で失敗した場合でも、バッファーを解放する必要があります。 | ||||||||||||||||
| prefmaxlen | DWORD | in | 返されるデータの優先最大長(バイト単位)です。MAX_PREFERRED_LENGTH を指定すると、NetUserEnum 関数はデータに必要な分のメモリを割り当てます。このパラメーターに別の値を指定すると、関数が返すバイト数を制限できます。バッファーサイズがすべてのエントリを保持するのに不十分な場合、関数は ERROR_MORE_DATA を返します。詳細については、 Network Management Function Buffers および Network Management Function Buffer Lengths を参照してください。 | ||||||||||||||||
| entriesread | DWORD* | out | 実際に列挙された要素の数を受け取る値へのポインターです。 | ||||||||||||||||
| totalentries | DWORD* | out | 現在の再開位置から列挙できたであろうエントリの総数を受け取る値へのポインターです。なお、アプリケーションはこの値をあくまで目安として扱う必要があります。アプリケーションが Windows 2000 以降のドメインコントローラーと通信している場合は、この種のデータをより効率的に取得するために ADSI LDAP プロバイダー の使用を検討してください。ADSI LDAP プロバイダーは、さまざまな ADSI インターフェイスをサポートする一連の ADSI オブジェクトを実装しています。詳細については、 ADSI Service Providers を参照してください。 LAN Manager: 呼び出し先が LAN Manager 2.x を実行しているコンピューターである場合、totalentries パラメーターは、再開シーケンスのどの位置にあるかにかかわらず、常にデータベース内のエントリの総数を反映します。 | ||||||||||||||||
| resume_handle | DWORD* | inoutoptional | 既存のユーザー検索を継続するために使用される再開ハンドルを含む値へのポインターです。最初の呼び出しではハンドルをゼロにし、それ以降の呼び出しでは変更しないでください。このパラメーターが NULL の場合、再開ハンドルは保存されません。 |
戻り値の型: DWORD
公式ドキュメント
NetUserEnum 関数は、サーバー上のすべてのユーザーアカウントに関する情報を取得します。
戻り値
関数が成功した場合、戻り値は NERR_Success です。
関数が失敗した場合、戻り値は次のいずれかのエラーコードになります。
| 戻り値 | 説明 |
|---|---|
| ユーザーは要求された情報へのアクセス権を持っていません。 | |
| システムコールレベルが正しくありません。このエラーは、level パラメーターにサポートされていない値が設定された場合に返されます。 | |
|
バッファーが小さすぎて 1 エントリを格納できません。バッファーには何も書き込まれていません。 |
|
コンピューター名が無効です。 |
| さらにエントリがあります。すべてのエントリを受け取るのに十分な大きさのバッファーを指定してください。 |
解説(Remarks)
NetUserEnum 関数は、指定されたリモートサーバーまたはローカルコンピューター上のすべてのユーザーアカウントに関する情報を取得します。
NetQueryDisplayInformation 関数を使用すると、ユーザーインターフェイスでの表示用に、ユーザー、コンピューター、またはグローバルグループのアカウント情報をすばやく列挙できます。
Active Directory 向けにプログラミングしている場合は、特定の Active Directory Service Interface (ADSI) メソッドを呼び出すことで、ネットワーク管理ユーザー関数を呼び出して実現できるのと同じ機能を実現できる場合があります。詳細については、 IADsUser および IADsComputer を参照してください。
Active Directory を実行しているドメインコントローラー上で NetUserEnum 関数を呼び出すと、セキュリティ保護可能なオブジェクトのアクセス制御リスト (ACL) に基づいてアクセスが許可または拒否されます。既定の ACL では、すべての認証済みユーザーおよび「Pre-Windows 2000 compatible access」グループのメンバーが情報を参照できます。メンバーサーバーまたはワークステーション上でこの関数を呼び出した場合は、すべての認証済みユーザーが情報を参照できます。これらのプラットフォームでの匿名アクセスおよび匿名アクセスの制限については、 Security Requirements for the Network Management Functions を参照してください。ACL、ACE、およびアクセストークンの詳細については、 Access Control Model を参照してください。
NetUserEnum 関数は、呼び出し元が読み取りアクセス権を持つ情報のみを返します。呼び出し元は、Domain オブジェクトに対する List Contents アクセス権、および System コンテナー内にある SAM Server オブジェクトに対する Enumerate Entire SAM Domain アクセス権を持っている必要があります。
LsaEnumerateTrustedDomains または LsaEnumerateTrustedDomainsEx 関数を使用すると、ローカルセキュリティ機関 (LSA) ポリシーオブジェクトによって信頼されているドメインの名前と SID を取得できます。
NetUserEnum 関数は、すべてのシステムユーザーを返すわけではありません。NetUserAdd 関数の呼び出しによって追加されたユーザーのみを返します。ユーザーのリストがソートされた順序で返される保証はありません。
NetUserEnum 関数を呼び出し、level パラメーターに情報レベル 1、2、または 3 を指定した場合、パスワードのセキュリティを維持するために、取得される各構造体のパスワードメンバーは NULL に設定されます。
ユーザーアカウント名は 20 文字まで、グループ名は 256 文字までに制限されています。さらに、アカウント名は末尾をピリオドにすることはできず、また、カンマや次の印字可能文字を含めることはできません: ", /, , [, ], :, |, <, >, +, =, ;, ?, *。名前には、印字不可能な 1 ~ 31 の範囲の文字も含めることはできません。
NetUserEnum 関数は、level パラメーターの値 4 および USER_INFO_4 構造体をサポートしていません。NetUserGetInfo 関数は、level パラメーターの値 4 および USER_INFO_4 構造体をサポートしています。
例
次のコードサンプルは、NetUserEnum 関数の呼び出しによってサーバー上のユーザーアカウントに関する情報を取得する方法を示しています。このサンプルでは、グローバルユーザーアカウントのみを列挙するために情報レベル 0 (USER_INFO_0) を指定して NetUserEnum を呼び出します。呼び出しが成功すると、コードはエントリをループ処理し、各ユーザーアカウントの名前を出力します。最後に、コードサンプルは情報バッファーに割り当てられたメモリを解放し、列挙されたユーザーの合計数を出力します。
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <lm.h>
int wmain(int argc, wchar_t *argv[])
{
LPUSER_INFO_0 pBuf = NULL;
LPUSER_INFO_0 pTmpBuf;
DWORD dwLevel = 0;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwResumeHandle = 0;
DWORD i;
DWORD dwTotalCount = 0;
NET_API_STATUS nStatus;
LPTSTR pszServerName = NULL;
if (argc > 2)
{
fwprintf(stderr, L"Usage: %s [\\\\ServerName]\n", argv[0]);
exit(1);
}
// The server is not the default local computer.
//
if (argc == 2)
pszServerName = (LPTSTR) argv[1];
wprintf(L"\nUser account on %s: \n", pszServerName);
//
// Call the NetUserEnum function, specifying level 0;
// enumerate global user account types only.
//
do // begin do
{
nStatus = NetUserEnum((LPCWSTR) pszServerName,
dwLevel,
FILTER_NORMAL_ACCOUNT, // global users
(LPBYTE*)&pBuf,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries,
&dwResumeHandle);
//
// If the call succeeds,
//
if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
{
if ((pTmpBuf = pBuf) != NULL)
{
//
// Loop through the entries.
//
for (i = 0; (i < dwEntriesRead); i++)
{
assert(pTmpBuf != NULL);
if (pTmpBuf == NULL)
{
fprintf(stderr, "An access violation has occurred\n");
break;
}
//
// Print the name of the user account.
//
wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);
pTmpBuf++;
dwTotalCount++;
}
}
}
//
// Otherwise, print the system error.
//
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
//
// Free the allocated buffer.
//
if (pBuf != NULL)
{
NetApiBufferFree(pBuf);
pBuf = NULL;
}
}
// Continue to call NetUserEnum while
// there are more entries.
//
while (nStatus == ERROR_MORE_DATA); // end do
//
// Check again for allocated memory.
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
//
// Print the final count of users enumerated.
//
fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount);
return 0;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// NETAPI32.dll
#include <windows.h>
DWORD NetUserEnum(
LPCWSTR servername, // optional
DWORD level,
NET_USER_ENUM_FILTER_FLAGS filter,
BYTE** bufptr,
DWORD prefmaxlen,
DWORD* entriesread,
DWORD* totalentries,
DWORD* resume_handle // optional
);[DllImport("NETAPI32.dll", ExactSpelling = true)]
static extern uint NetUserEnum(
[MarshalAs(UnmanagedType.LPWStr)] string servername, // LPCWSTR optional
uint level, // DWORD
uint filter, // NET_USER_ENUM_FILTER_FLAGS
IntPtr bufptr, // BYTE** out
uint prefmaxlen, // DWORD
out uint entriesread, // DWORD* out
out uint totalentries, // DWORD* out
IntPtr resume_handle // DWORD* optional, in/out
);<DllImport("NETAPI32.dll", ExactSpelling:=True)>
Public Shared Function NetUserEnum(
<MarshalAs(UnmanagedType.LPWStr)> servername As String, ' LPCWSTR optional
level As UInteger, ' DWORD
filter As UInteger, ' NET_USER_ENUM_FILTER_FLAGS
bufptr As IntPtr, ' BYTE** out
prefmaxlen As UInteger, ' DWORD
<Out> ByRef entriesread As UInteger, ' DWORD* out
<Out> ByRef totalentries As UInteger, ' DWORD* out
resume_handle As IntPtr ' DWORD* optional, in/out
) As UInteger
End Function' servername : LPCWSTR optional
' level : DWORD
' filter : NET_USER_ENUM_FILTER_FLAGS
' bufptr : BYTE** out
' prefmaxlen : DWORD
' entriesread : DWORD* out
' totalentries : DWORD* out
' resume_handle : DWORD* optional, in/out
Declare PtrSafe Function NetUserEnum Lib "netapi32" ( _
ByVal servername As LongPtr, _
ByVal level As Long, _
ByVal filter As Long, _
ByVal bufptr As LongPtr, _
ByVal prefmaxlen As Long, _
ByRef entriesread As Long, _
ByRef totalentries As Long, _
ByVal resume_handle As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
NetUserEnum = ctypes.windll.netapi32.NetUserEnum
NetUserEnum.restype = wintypes.DWORD
NetUserEnum.argtypes = [
wintypes.LPCWSTR, # servername : LPCWSTR optional
wintypes.DWORD, # level : DWORD
wintypes.DWORD, # filter : NET_USER_ENUM_FILTER_FLAGS
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(wintypes.DWORD), # resume_handle : DWORD* optional, in/out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('NETAPI32.dll')
NetUserEnum = Fiddle::Function.new(
lib['NetUserEnum'],
[
Fiddle::TYPE_VOIDP, # servername : LPCWSTR optional
-Fiddle::TYPE_INT, # level : DWORD
-Fiddle::TYPE_INT, # filter : NET_USER_ENUM_FILTER_FLAGS
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, # resume_handle : DWORD* optional, in/out
],
-Fiddle::TYPE_INT)#[link(name = "netapi32")]
extern "system" {
fn NetUserEnum(
servername: *const u16, // LPCWSTR optional
level: u32, // DWORD
filter: u32, // NET_USER_ENUM_FILTER_FLAGS
bufptr: *mut *mut u8, // BYTE** out
prefmaxlen: u32, // DWORD
entriesread: *mut u32, // DWORD* out
totalentries: *mut u32, // DWORD* out
resume_handle: *mut u32 // DWORD* optional, in/out
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("NETAPI32.dll")]
public static extern uint NetUserEnum([MarshalAs(UnmanagedType.LPWStr)] string servername, uint level, uint filter, IntPtr bufptr, uint prefmaxlen, out uint entriesread, out uint totalentries, IntPtr resume_handle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'NETAPI32_NetUserEnum' -Namespace Win32 -PassThru
# $api::NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)#uselib "NETAPI32.dll"
#func global NetUserEnum "NetUserEnum" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; NetUserEnum servername, level, filter, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resume_handle) ; 戻り値は stat
; servername : LPCWSTR optional -> "sptr"
; level : DWORD -> "sptr"
; filter : NET_USER_ENUM_FILTER_FLAGS -> "sptr"
; bufptr : BYTE** out -> "sptr"
; prefmaxlen : DWORD -> "sptr"
; entriesread : DWORD* out -> "sptr"
; totalentries : DWORD* out -> "sptr"
; resume_handle : DWORD* optional, in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "NETAPI32.dll" #cfunc global NetUserEnum "NetUserEnum" wstr, int, int, var, int, var, var, var ; res = NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; filter : NET_USER_ENUM_FILTER_FLAGS -> "int" ; bufptr : BYTE** out -> "var" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "var" ; totalentries : DWORD* out -> "var" ; resume_handle : DWORD* optional, in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "NETAPI32.dll" #cfunc global NetUserEnum "NetUserEnum" wstr, int, int, sptr, int, sptr, sptr, sptr ; res = NetUserEnum(servername, level, filter, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resume_handle)) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; filter : NET_USER_ENUM_FILTER_FLAGS -> "int" ; bufptr : BYTE** out -> "sptr" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "sptr" ; totalentries : DWORD* out -> "sptr" ; resume_handle : DWORD* optional, in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; DWORD NetUserEnum(LPCWSTR servername, DWORD level, NET_USER_ENUM_FILTER_FLAGS filter, BYTE** bufptr, DWORD prefmaxlen, DWORD* entriesread, DWORD* totalentries, DWORD* resume_handle) #uselib "NETAPI32.dll" #cfunc global NetUserEnum "NetUserEnum" wstr, int, int, var, int, var, var, var ; res = NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; filter : NET_USER_ENUM_FILTER_FLAGS -> "int" ; bufptr : BYTE** out -> "var" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "var" ; totalentries : DWORD* out -> "var" ; resume_handle : DWORD* optional, in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; DWORD NetUserEnum(LPCWSTR servername, DWORD level, NET_USER_ENUM_FILTER_FLAGS filter, BYTE** bufptr, DWORD prefmaxlen, DWORD* entriesread, DWORD* totalentries, DWORD* resume_handle) #uselib "NETAPI32.dll" #cfunc global NetUserEnum "NetUserEnum" wstr, int, int, intptr, int, intptr, intptr, intptr ; res = NetUserEnum(servername, level, filter, varptr(bufptr), prefmaxlen, varptr(entriesread), varptr(totalentries), varptr(resume_handle)) ; servername : LPCWSTR optional -> "wstr" ; level : DWORD -> "int" ; filter : NET_USER_ENUM_FILTER_FLAGS -> "int" ; bufptr : BYTE** out -> "intptr" ; prefmaxlen : DWORD -> "int" ; entriesread : DWORD* out -> "intptr" ; totalentries : DWORD* out -> "intptr" ; resume_handle : DWORD* optional, in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
netapi32 = windows.NewLazySystemDLL("NETAPI32.dll")
procNetUserEnum = netapi32.NewProc("NetUserEnum")
)
// servername (LPCWSTR optional), level (DWORD), filter (NET_USER_ENUM_FILTER_FLAGS), bufptr (BYTE** out), prefmaxlen (DWORD), entriesread (DWORD* out), totalentries (DWORD* out), resume_handle (DWORD* optional, in/out)
r1, _, err := procNetUserEnum.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(servername))),
uintptr(level),
uintptr(filter),
uintptr(bufptr),
uintptr(prefmaxlen),
uintptr(entriesread),
uintptr(totalentries),
uintptr(resume_handle),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // DWORDfunction NetUserEnum(
servername: PWideChar; // LPCWSTR optional
level: DWORD; // DWORD
filter: DWORD; // NET_USER_ENUM_FILTER_FLAGS
bufptr: Pointer; // BYTE** out
prefmaxlen: DWORD; // DWORD
entriesread: Pointer; // DWORD* out
totalentries: Pointer; // DWORD* out
resume_handle: Pointer // DWORD* optional, in/out
): DWORD; stdcall;
external 'NETAPI32.dll' name 'NetUserEnum';result := DllCall("NETAPI32\NetUserEnum"
, "WStr", servername ; LPCWSTR optional
, "UInt", level ; DWORD
, "UInt", filter ; NET_USER_ENUM_FILTER_FLAGS
, "Ptr", bufptr ; BYTE** out
, "UInt", prefmaxlen ; DWORD
, "Ptr", entriesread ; DWORD* out
, "Ptr", totalentries ; DWORD* out
, "Ptr", resume_handle ; DWORD* optional, in/out
, "UInt") ; return: DWORD●NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle) = DLL("NETAPI32.dll", "dword NetUserEnum(char*, dword, dword, void*, dword, void*, void*, void*)")
# 呼び出し: NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)
# servername : LPCWSTR optional -> "char*"
# level : DWORD -> "dword"
# filter : NET_USER_ENUM_FILTER_FLAGS -> "dword"
# bufptr : BYTE** out -> "void*"
# prefmaxlen : DWORD -> "dword"
# entriesread : DWORD* out -> "void*"
# totalentries : DWORD* out -> "void*"
# resume_handle : DWORD* optional, in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "netapi32" fn NetUserEnum(
servername: [*c]const u16, // LPCWSTR optional
level: u32, // DWORD
filter: u32, // NET_USER_ENUM_FILTER_FLAGS
bufptr: [*c][*c]u8, // BYTE** out
prefmaxlen: u32, // DWORD
entriesread: [*c]u32, // DWORD* out
totalentries: [*c]u32, // DWORD* out
resume_handle: [*c]u32 // DWORD* optional, in/out
) callconv(std.os.windows.WINAPI) u32;proc NetUserEnum(
servername: WideCString, # LPCWSTR optional
level: uint32, # DWORD
filter: uint32, # NET_USER_ENUM_FILTER_FLAGS
bufptr: ptr uint8, # BYTE** out
prefmaxlen: uint32, # DWORD
entriesread: ptr uint32, # DWORD* out
totalentries: ptr uint32, # DWORD* out
resume_handle: ptr uint32 # DWORD* optional, in/out
): uint32 {.importc: "NetUserEnum", stdcall, dynlib: "NETAPI32.dll".}pragma(lib, "netapi32");
extern(Windows)
uint NetUserEnum(
const(wchar)* servername, // LPCWSTR optional
uint level, // DWORD
uint filter, // NET_USER_ENUM_FILTER_FLAGS
ubyte** bufptr, // BYTE** out
uint prefmaxlen, // DWORD
uint* entriesread, // DWORD* out
uint* totalentries, // DWORD* out
uint* resume_handle // DWORD* optional, in/out
);ccall((:NetUserEnum, "NETAPI32.dll"), stdcall, UInt32,
(Cwstring, UInt32, UInt32, Ptr{UInt8}, UInt32, Ptr{UInt32}, Ptr{UInt32}, Ptr{UInt32}),
servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)
# servername : LPCWSTR optional -> Cwstring
# level : DWORD -> UInt32
# filter : NET_USER_ENUM_FILTER_FLAGS -> UInt32
# bufptr : BYTE** out -> Ptr{UInt8}
# prefmaxlen : DWORD -> UInt32
# entriesread : DWORD* out -> Ptr{UInt32}
# totalentries : DWORD* out -> Ptr{UInt32}
# resume_handle : DWORD* optional, in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t NetUserEnum(
const uint16_t* servername,
uint32_t level,
uint32_t filter,
uint8_t** bufptr,
uint32_t prefmaxlen,
uint32_t* entriesread,
uint32_t* totalentries,
uint32_t* resume_handle);
]]
local netapi32 = ffi.load("netapi32")
-- netapi32.NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)
-- servername : LPCWSTR optional
-- level : DWORD
-- filter : NET_USER_ENUM_FILTER_FLAGS
-- bufptr : BYTE** out
-- prefmaxlen : DWORD
-- entriesread : DWORD* out
-- totalentries : DWORD* out
-- resume_handle : DWORD* optional, in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('NETAPI32.dll');
const NetUserEnum = lib.func('__stdcall', 'NetUserEnum', 'uint32_t', ['str16', 'uint32_t', 'uint32_t', 'uint8_t *', 'uint32_t', 'uint32_t *', 'uint32_t *', 'uint32_t *']);
// NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)
// servername : LPCWSTR optional -> 'str16'
// level : DWORD -> 'uint32_t'
// filter : NET_USER_ENUM_FILTER_FLAGS -> 'uint32_t'
// bufptr : BYTE** out -> 'uint8_t *'
// prefmaxlen : DWORD -> 'uint32_t'
// entriesread : DWORD* out -> 'uint32_t *'
// totalentries : DWORD* out -> 'uint32_t *'
// resume_handle : DWORD* optional, in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("NETAPI32.dll", {
NetUserEnum: { parameters: ["buffer", "u32", "u32", "pointer", "u32", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)
// servername : LPCWSTR optional -> "buffer"
// level : DWORD -> "u32"
// filter : NET_USER_ENUM_FILTER_FLAGS -> "u32"
// bufptr : BYTE** out -> "pointer"
// prefmaxlen : DWORD -> "u32"
// entriesread : DWORD* out -> "pointer"
// totalentries : DWORD* out -> "pointer"
// resume_handle : DWORD* optional, in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t NetUserEnum(
const uint16_t* servername,
uint32_t level,
uint32_t filter,
uint8_t** bufptr,
uint32_t prefmaxlen,
uint32_t* entriesread,
uint32_t* totalentries,
uint32_t* resume_handle);
C, "NETAPI32.dll");
// $ffi->NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle);
// servername : LPCWSTR optional
// level : DWORD
// filter : NET_USER_ENUM_FILTER_FLAGS
// bufptr : BYTE** out
// prefmaxlen : DWORD
// entriesread : DWORD* out
// totalentries : DWORD* out
// resume_handle : DWORD* 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 NetUserEnum(
WString servername, // LPCWSTR optional
int level, // DWORD
int filter, // NET_USER_ENUM_FILTER_FLAGS
Pointer bufptr, // BYTE** out
int prefmaxlen, // DWORD
IntByReference entriesread, // DWORD* out
IntByReference totalentries, // DWORD* out
IntByReference resume_handle // DWORD* optional, in/out
);
}@[Link("netapi32")]
lib LibNETAPI32
fun NetUserEnum = NetUserEnum(
servername : UInt16*, # LPCWSTR optional
level : UInt32, # DWORD
filter : UInt32, # NET_USER_ENUM_FILTER_FLAGS
bufptr : UInt8**, # BYTE** out
prefmaxlen : UInt32, # DWORD
entriesread : UInt32*, # DWORD* out
totalentries : UInt32*, # DWORD* out
resume_handle : UInt32* # DWORD* 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 NetUserEnumNative = Uint32 Function(Pointer<Utf16>, Uint32, Uint32, Pointer<Uint8>, Uint32, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>);
typedef NetUserEnumDart = int Function(Pointer<Utf16>, int, int, Pointer<Uint8>, int, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>);
final NetUserEnum = DynamicLibrary.open('NETAPI32.dll')
.lookupFunction<NetUserEnumNative, NetUserEnumDart>('NetUserEnum');
// servername : LPCWSTR optional -> Pointer<Utf16>
// level : DWORD -> Uint32
// filter : NET_USER_ENUM_FILTER_FLAGS -> Uint32
// bufptr : BYTE** out -> Pointer<Uint8>
// prefmaxlen : DWORD -> Uint32
// entriesread : DWORD* out -> Pointer<Uint32>
// totalentries : DWORD* out -> Pointer<Uint32>
// resume_handle : DWORD* optional, in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function NetUserEnum(
servername: PWideChar; // LPCWSTR optional
level: DWORD; // DWORD
filter: DWORD; // NET_USER_ENUM_FILTER_FLAGS
bufptr: Pointer; // BYTE** out
prefmaxlen: DWORD; // DWORD
entriesread: Pointer; // DWORD* out
totalentries: Pointer; // DWORD* out
resume_handle: Pointer // DWORD* optional, in/out
): DWORD; stdcall;
external 'NETAPI32.dll' name 'NetUserEnum';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "NetUserEnum"
c_NetUserEnum :: CWString -> Word32 -> Word32 -> Ptr Word8 -> Word32 -> Ptr Word32 -> Ptr Word32 -> Ptr Word32 -> IO Word32
-- servername : LPCWSTR optional -> CWString
-- level : DWORD -> Word32
-- filter : NET_USER_ENUM_FILTER_FLAGS -> Word32
-- bufptr : BYTE** out -> Ptr Word8
-- prefmaxlen : DWORD -> Word32
-- entriesread : DWORD* out -> Ptr Word32
-- totalentries : DWORD* out -> Ptr Word32
-- resume_handle : DWORD* optional, in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let netuserenum =
foreign "NetUserEnum"
((ptr uint16_t) @-> uint32_t @-> uint32_t @-> (ptr uint8_t) @-> uint32_t @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> returning uint32_t)
(* servername : LPCWSTR optional -> (ptr uint16_t) *)
(* level : DWORD -> uint32_t *)
(* filter : NET_USER_ENUM_FILTER_FLAGS -> uint32_t *)
(* bufptr : BYTE** out -> (ptr uint8_t) *)
(* prefmaxlen : DWORD -> uint32_t *)
(* entriesread : DWORD* out -> (ptr uint32_t) *)
(* totalentries : DWORD* out -> (ptr uint32_t) *)
(* resume_handle : DWORD* optional, in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library netapi32 (t "NETAPI32.dll"))
(cffi:use-foreign-library netapi32)
(cffi:defcfun ("NetUserEnum" net-user-enum :convention :stdcall) :uint32
(servername (:string :encoding :utf-16le)) ; LPCWSTR optional
(level :uint32) ; DWORD
(filter :uint32) ; NET_USER_ENUM_FILTER_FLAGS
(bufptr :pointer) ; BYTE** out
(prefmaxlen :uint32) ; DWORD
(entriesread :pointer) ; DWORD* out
(totalentries :pointer) ; DWORD* out
(resume-handle :pointer)) ; DWORD* optional, in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $NetUserEnum = Win32::API::More->new('NETAPI32',
'DWORD NetUserEnum(LPCWSTR servername, DWORD level, DWORD filter, LPVOID bufptr, DWORD prefmaxlen, LPVOID entriesread, LPVOID totalentries, LPVOID resume_handle)');
# my $ret = $NetUserEnum->Call($servername, $level, $filter, $bufptr, $prefmaxlen, $entriesread, $totalentries, $resume_handle);
# servername : LPCWSTR optional -> LPCWSTR
# level : DWORD -> DWORD
# filter : NET_USER_ENUM_FILTER_FLAGS -> DWORD
# bufptr : BYTE** out -> LPVOID
# prefmaxlen : DWORD -> DWORD
# entriesread : DWORD* out -> LPVOID
# totalentries : DWORD* out -> LPVOID
# resume_handle : DWORD* optional, in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f LsaEnumerateTrustedDomains — ポリシーに登録された信頼ドメインの一覧を列挙する。
- f LsaEnumerateTrustedDomainsEx — 信頼ドメインの詳細情報を含む一覧を列挙する。
- f NetQueryDisplayInformation — ユーザーやグループの表示情報を高速に列挙する。
- f NetUserAdd — サーバーに新しいユーザーアカウントを追加する。
- f NetUserGetGroups — ユーザーが所属するグローバルグループを取得する。
- f NetUserGetInfo — 指定したユーザーアカウントの情報を取得する。
- s USER_INFO_0
- s USER_INFO_1
- s USER_INFO_10
- s USER_INFO_11
- s USER_INFO_2
- s USER_INFO_20