안녕하세요. 언제나휴일입니다.
Windows 운영체제에서 그룹 내 사용자 목록을 열거하는 NetLocalGroupGetMembers함수를 알아봅시다.
간단한 예제 코드와 함수의 인자 목록에 대해 알아볼게요.
예제 코드
NetLocalGroupEnum 함수로 그룹 목록을 출력합니다.
사용자가 원하는 그룹을 선택합니다.
선택한 그룹에 속하는 사용자 계정을 열거합니다.
#include <Windows.h>
#include <lmaccess.h>
#include <lmapibuf.h>
#include <stdio.h>
#include <locale.h>
#pragma comment(lib,"netapi32")
int main()
{
setlocale(LC_ALL, "KOREAN");
PLOCALGROUP_INFO_1 base;
DWORD total;
DWORD rcnt;
PLOCALGROUP_INFO_1 info;
DWORD_PTR handle = 0;
NetLocalGroupEnum(NULL,1,(LPBYTE*)&base,0xFFFFFFFF,&rcnt,&total,NULL);
for (int i = 0; i < rcnt; i++)
{
info = base + i;
wprintf(TEXT("%d:%s\n"),i, info->lgrpi1_name);
}
int index = 0;
printf("번호:");
scanf_s("%d", &index);
LOCALGROUP_MEMBERS_INFO_2 *buffer;
int val = NetLocalGroupGetMembers(
NULL, //서버 이름, NULL이면 로컬 컴퓨터
base[index].lgrpi1_name,//그룹 이름
2, //데이터 정보 수준
(LPBYTE*)&buffer,//정보를 수신하는 버퍼(시스템에서 할당)
0xFFFFFFFF,//수신할 버퍼의 최대 길이(바이트)
&rcnt,//실제 열거한 요소(그룹) 수
&total,//다시 열거할 때 수신할 수 있는 요소(그룹) 수, 힌트로 사용
NULL);//다시 열거하고자 할 때 사용(핸들)
for (int i = 0; i < rcnt; i++)
{
wprintf(TEXT("%s\n"), buffer[i].lgrmi2_domainandname);
}
NetApiBufferFree(base);
NetApiBufferFree(buffer);
return 0;
}
실행 결과 예
0:Administrators
1:Device Owners
2:Distributed COM Users
3:Event Log Readers
4:Guests
5:Hyper-V Administrators
6:IIS_IUSRS
7:Performance Log Users
8:Performance Monitor Users
9:Remote Management Users
10:System Managed Accounts Group
11:Users
12:SQLServer2005SQLBrowserUser$DESKTOP-T87J0UT
번호:11
NT AUTHORITY\Authenticated Users
NT AUTHORITY\INTERACTIVE
DESKTOP-T87J0UT\홍길동
NetLocalGroupGetMembers 함수
NetLocalGroupGetMembers 함수는 그룹에 속하는 사용자(계정) 정보를 열거하는 함수입니다.(MSDN)
NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetMembers(
LPCWSTR servername,
LPCWSTR localgroupname,
DWORD level,
LPBYTE *bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
PDWORD_PTR resumehandle
);
NetLocalGroupGetMembers 함수는 lmaccess.h 파일을 포함하여 사용합니다.
그리고 “netapi32.dll” 파일을 참조 추가하여 사용합니다.
#include <Windows.h>
#include <lmaccess.h>
#pragma comment(lib,"netapi32")
LPCWSTR servername
서버의 이름입니다. NULL이면 로컬 컴퓨터입니다.
LPCWSTR localgroupname
그룹 이름입니다. 그룹 목록을 알고자 한다면 NetLocalGroupEnum 함수를 이용하세요.
DWORD level
데이터 정보 수준입니다.
0일 때 LOCALGROUP_MEMBERS_INFO_0구조체
typedef struct _LOCALGROUP_MEMBERS_INFO_0 {
PSID lgrmi0_sid;
} LOCALGROUP_MEMBERS_INFO_0;
1일 때 LOCALGROUP_MEMBERS_INFO_1구조체
typedef struct _LOCALGROUP_MEMBERS_INFO_1 {
PSID lgrmi1_sid;
SID_NAME_USE lgrmi1_sidusage;
LPWSTR lgrmi1_name;
} LOCALGROUP_MEMBERS_INFO_1;
2일 때 LOCALGROUP_MEMBERS_INFO_2구조체
3일 때 LOCALGROUP_MEMBERS_INFO_3구조체
DWORD filter
사용자 계정 유형을 지정합니다.
0이면 모든 일반 사용자, 트러스트 데이터 및 컴퓨터 계정 데이터를 포함합니다.
다음 항목의 조합을 사용할 수도 있습니다.
FILTER_TEMP_DUPLICATE_ACCOUNT
FILTER_NORMAL_ACCOUNT
FILTER_INTERDOMAIN_TRUST_ACCOUNT
FILTER_WORKSTATION_TRUST_ACCOUNT
FILTER_SERVER_TRUST_ACCOUNT
LPBYTE *bufptr
수신할 버퍼의 주소입니다. 버퍼는 시스템이 할당합니다. 할당한 메모리는 NetApiBufferFree 함수로 해제합니다.
DWORD prefmaxlen
수신 버퍼의 최대 길이(바이트)입니다.
LPDWORD entriesread
실제 열거한 사용자(계정) 수입니다.
LPDWORD totalentries
힌트로 사용할 수 있는 값으로 현재 다시 시작 위치에서 열거할 수 있는 사용자(계정) 수입니다.
PDWORD resume_handle
사용자(계정) 검색을 계속할 때 사용하는 핸들입니다.
반환 값
성공하면 0을 반환합니다.
실패일 때 다음 오류 코드 중 하나일 수 있습니다.
ERROR_ACCESS_DENIED : 권한이 없음
ERROR_INVALID_LEVEL : level 매개 변수가 지원하지 않는 값임
ERROR_NO_SUCH_ALIAS : 지정한 로컬 그룹이 없습니다.
NERR_InvalidComputer : 컴퓨터 이름이 잘못
ERROR_MORE_DATA : 더 많은 항목이 있음(오류라고 보는 것보다 나머지를 열거하기 위해 다시 호출이 필요함, 이 때는 마지막 인자인 resume_handle 변수를 전달해 주어야 합니다.)