윈도우즈 그룹 계정 열거하기 – NetLocalGroupEnum 함수

안녕하세요. 언제나휴일입니다.

Windows 운영체제에서 그룹 계정을 열거하는 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,//서버 이름 NULL이면 로컬 컴퓨터
        1,//데이터 정보 수준 (0,1) 0일 때 LOCALGROUP_INFO_0, 1일 때 LOCALGROUP_INFO_1 
        (LPBYTE*)&base, //정보를 수신하는 버퍼(시스템에서 할당, NetApiBufferFree 함수로 해제)
        0xFFFFFFFF,//수신할 버퍼의 최대 길이(바이트)
        &rcnt,//실제 열거한 요소(그룹) 수
        &total, //다시 열거할 때 수신할 수 있는 요소(그룹) 수, 힌트로 사용
        NULL);//다시 열거하고자 할 때 사용(핸들)
    for (int i = 0; i < rcnt; i++)
    {
        info = base + i;
        wprintf(TEXT("%s\n"), info->lgrpi1_name);
    }
    NetApiBufferFree(base);
	return 0;
}

실행 결과 예

Administrators
Device Owners
Distributed COM Users
Event Log Readers
Guests
Hyper-V Administrators
IIS_IUSRS
Performance Log Users
Performance Monitor Users
Remote Management Users
System Managed Accounts Group
Users
SQLServer2005SQLBrowserUser$DESKTOP-T87J0UT

NetLocalGroupEnum 함수

NetLocalGroupEnum 함수는 그룹(계정) 정보를 열거하는 함수입니다. (MSDN)

NET_API_STATUS NetLocalGroupEnum(
  LPCWSTR    servername,
  DWORD      level,
  LPBYTE     *bufptr,
  DWORD      prefmaxlen,
  LPDWORD    entriesread,
  LPDWORD    totalentries,
  PDWORD_PTR resumehandle
);
#define NET_API_STATUS          DWORD

NetLocalGroupEnum 함수는 lmaccess.h 파일을 포함하여 사용합니다.

그리고 “netapi32.dll” 파일을 참조 추가하여 사용합니다.

#include <Windows.h>
#include <lmaccess.h>
#pragma comment(lib,"netapi32")

LPCWSTR servername

서버의 이름입니다. NULL이면 로컬 컴퓨터입니다.

DWORD level

데이터 정보 수준입니다.

0이면 LOCALGROUP_INFO_0 구조체 배열

typedef struct _LOCALGROUP_INFO_0 {
LPWSTR lgrpi0_name;
}LOCALGROUP_INFO_0;

1이면 LOCALGROUP_INFO_1 구조체 배열

typedef struct _LOCALGROUP_INFO_1 {
LPWSTR lgrpi1_name;
LPWSTR lgrpi1_comment;
}LOCALGROUP_INFO_1;

LPBYTE *bufptr

정보를 수신할 버퍼입니다. 시스템에서 할당해 주며 NetApiBufferFree 함수로 해제합니다.

DWORD prefmaxlen

수신 버퍼의 최대 길이(바이트)입니다.

LPDWORD entriesread

실제 열거한 사용자(계정) 수입니다.

LPDWORD totalentries

힌트로 사용할 수 있는 값으로 현재 다시 시작 위치에서 열거할 수 있는 사용자(계정) 수입니다.

PDWORD resume_handle

사용자(계정) 검색을 계속할 때 사용하는 핸들입니다.

반환 값

성공하면 0을 반환합니다.

실패하면 다음 중 하나의 오류 코드 값일 수 있습니다.

ERROR_ACCESS_DENIED: 사용자는 요청한 정보에 대한 액세스 권한이 없습니다.

ERROR_MORE_DATA : 더 많은 항목이 있음(오류라고 보는 것보다 나머지를 열거하기 위해 다시 호출이 필요함, 이 때는 마지막 인자인 resume_handle 변수를 전달해 주어야 합니다.)

NERR_BufTooSmall : 버퍼가 너무 작음

NERR_InvalidComputer : 컴퓨터 이름이 잘못