윈도우즈 사용자(계정) 목록 열거하기 – NetUserEnum 함수

유튜브 동영상 강의

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

Windows 운영체제에서 사용자 목록을 열거하는 NetUserEnum 함수를 알아봅시다.

간단한 예제 코드와 함수의 인자 목록에 대해 알아볼게요.

예제 코드

#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");

    PUSER_INFO_0 buffer;
    DWORD rcnt = 0;
    DWORD total = 0;
    
    NetUserEnum(NULL,//서버 이름(NULL이면 로컬 컴퓨터)
        0, //데이터 정보 수준 0일 때 USER_INFO_0 구조체 배열
        0, //계정유형 (0이면 모든 일반 사용자, 트로스트 데이터 및 컴퓨터 계정 데이터 포함)
        (LPBYTE*)&buffer,//수신할 버퍼의 포인터(시스템에 의해 할당)
        0xFFFFFFFF, //데이터의 기본 설정 최대 길이(바이트)
        &rcnt,//실제 열거한 요소 수
        &total,//다시 시작에서 열거할 수 있는 총 항목 수(힌트로만 고려)
        NULL);//계속 검색할 때 사용하는 핸들
    
    
    for (DWORD i = 0; i < total; i++)
    {
        wprintf(TEXT("%s\n"), buffer[i].usri0_name);
    }
    NetApiBufferFree(buffer);//메모리 해제
    return 0;
}

실행 결과 예

Administrator
BIT
DefaultAccount
Guest
WDAGUtilityAccount
홍길동

NetUserEnum 함수

NetUserEnum 함수는 사용자(계정) 정보를 열거하는 함수입니다. (MSDN )

NET_API_STATUS NetUserEnum (
    LPCWSTR     servername,
    DWORD      level,
    DWORD      filter,
    LPBYTE     *bufptr,
    DWORD      prefmaxlen,
    LPDWORD    entriesread,
    LPDWORD    totalentries,
    PDWORD resume_handle
    );
#define NET_API_STATUS          DWORD

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

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

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

LPCWSTR servername

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

DWORD level

데이터 정보 수준입니다.

0일 때 USER_INFO_0 구조체

typedef struct _USER_INFO_0 {
    LPWSTR   usri0_name;
}USER_INFO_0, *PUSER_INFO_0, *LPUSER_INFO_0;

1일 때 USER_INFO_1 구조체

typedef struct _USER_INFO_1 {
    LPWSTR   usri1_name;
    LPWSTR   usri1_password;
    DWORD    usri1_password_age;
    DWORD    usri1_priv;
    LPWSTR   usri1_home_dir;
    LPWSTR   usri1_comment;
    DWORD    usri1_flags;
    LPWSTR   usri1_script_path;
}USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;

2일 때 USER_INFO_2 구조체

3일 때 USER_INFO_3 구조체

10일 때 USER_INFO_10 구조체

11일 때 USER_INFO_11 구조체

20일 때 USER_INFO_20 구조체

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 매개 변수가 지원하지 않는 값임

NERR_BufTooSmall : 버퍼가 너무 작음

NERR_InvalidComputer : 컴퓨터 이름이 잘못

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