NetUserEnum 함수(lmaccess.h)

NetUserEnum 함수는 서버의 모든 사용자 계정에 대한 정보를 검색합니다.

구문

NET_API_STATUS NET_API_FUNCTION NetUserEnum(
  [in]      LPCWSTR servername,
  [in]      DWORD   level,
  [in]      DWORD   filter,
  [out]     LPBYTE  *bufptr,
  [in]      DWORD   prefmaxlen,
  [out]     LPDWORD entriesread,
  [out]     LPDWORD totalentries,
  [in, out] PDWORD  resume_handle
);

매개 변수

[in] servername

함수를 실행할 원격 서버의 DNS 또는 NetBIOS 이름을 지정하는 상수 문자열에 대한 포인터입니다. 이 매개 변수가 NULL이면 로컬 컴퓨터가 사용됩니다.

[in] level

데이터의 정보 수준을 지정합니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
0
사용자 계정 이름을 반환합니다. bufptr 매개 변수는 USER_INFO_0 구조체의 배열을 가리킵니다.
1
사용자 계정에 대한 자세한 정보를 반환합니다. bufptr 매개 변수는 USER_INFO_1 구조체의 배열을 가리킵니다.
2
권한 부여 수준 및 로그온 정보를 포함하여 사용자 계정에 대한 자세한 정보를 반환합니다. bufptr 매개 변수는 USER_INFO_2 구조체의 배열을 가리킵니다.
3
권한 부여 수준, 로그온 정보, 사용자 및 기본 그룹에 대한 RID 및 프로필 정보를 포함하여 사용자 계정에 대한 자세한 정보를 반환합니다. bufptr 매개 변수는 USER_INFO_3 구조체의 배열을 가리킵니다.
10
사용자 및 계정 이름 및 주석을 반환합니다. bufptr 매개 변수는 USER_INFO_10 구조체의 배열을 가리킵니다.
11
사용자 계정에 대한 자세한 정보를 반환합니다. bufptr 매개 변수는 USER_INFO_11 구조체의 배열을 가리킵니다.
20
사용자의 이름 및 식별자 및 다양한 계정 특성을 반환합니다. bufptr 매개 변수는 USER_INFO_20 구조체의 배열을 가리킵니다. Windows XP 이상에서는 대신 USER_INFO_23 사용하는 것이 좋습니다.

[in] filter

열거형에 포함할 사용자 계정 유형을 지정하는 값입니다. 값이 0이면 모든 일반 사용자, 신뢰 데이터 및 컴퓨터 계정 데이터가 포함되어야 합니다.

이 매개 변수는 다음 값의 조합일 수도 있습니다.

의미
FILTER_TEMP_DUPLICATE_ACCOUNT
기본 계정이 다른 도메인에 있는 사용자의 계정 데이터를 열거합니다. 이 계정 유형은 이 도메인에 대한 사용자 액세스를 제공하지만 이 도메인을 신뢰하는 도메인에는 액세스할 수 없습니다. 사용자 관리자는 이 계정 유형을 로컬 사용자 계정으로 참조합니다.
FILTER_NORMAL_ACCOUNT
일반 사용자 계정 데이터를 열거합니다. 이 계정 유형은 일반 사용자와 연결됩니다.
FILTER_INTERDOMAIN_TRUST_ACCOUNT
도메인 간 트러스트 계정 데이터를 열거합니다. 이 계정 유형은 다른 도메인을 신뢰하는 도메인의 트러스트 계정과 연결됩니다.
FILTER_WORKSTATION_TRUST_ACCOUNT
워크스테이션 또는 멤버 서버 트러스트 계정 데이터를 열거합니다. 이 계정 유형은 도메인의 구성원인 컴퓨터의 컴퓨터 계정과 연결됩니다.
FILTER_SERVER_TRUST_ACCOUNT
멤버 서버 컴퓨터 계정 데이터를 열거합니다. 이 계정 유형은 도메인의 구성원인 백업 도메인 컨트롤러의 컴퓨터 계정과 연결됩니다.

[out] bufptr

데이터를 수신하는 버퍼에 대한 포인터입니다. 이 데이터의 형식은 수준 매개 변수의 값에 따라 달라집니다.

이 데이터에 대한 버퍼는 시스템에 의해 할당되며 애플리케이션은 반환된 데이터가 더 이상 필요하지 않을 때 할당된 메모리를 해제하기 위해 NetApiBufferFree 함수를 호출해야 합니다. NetUserEnum 함수가 ERROR_MORE_DATA 실패하더라도 버퍼를 해제해야 합니다.

[in] prefmaxlen

반환된 데이터의 기본 설정 최대 길이(바이트)입니다. MAX_PREFERRED_LENGTH 지정하는 경우 NetUserEnum 함수는 데이터에 필요한 메모리 양을 할당합니다. 이 매개 변수에 다른 값을 지정하면 함수가 반환하는 바이트 수를 제한할 수 있습니다. 버퍼 크기가 모든 항목을 보유하기에 충분하지 않은 경우 함수는 ERROR_MORE_DATA 반환합니다. 자세한 내용은 네트워크 관리 함수 버퍼 및 네트워크관리 함수 버퍼 길이를 참조하세요.

[out] entriesread

실제로 열거된 요소 수를 수신하는 값에 대한 포인터입니다.

[out] totalentries

현재 다시 시작 위치에서 열거될 수 있는 총 항목 수를 수신하는 값에 대한 포인터입니다. 애플리케이션은 이 값을 힌트로만 고려해야 합니다. 애플리케이션이 Windows 2000 이상 도메인 컨트롤러와 통신하는 경우 ADSI LDAP 공급자 를 사용하여 이러한 유형의 데이터를 보다 효율적으로 검색하는 것이 좋습니다. ADSI LDAP 공급자는 다양한 ADSI 인터페이스를 지원하는 ADSI 개체 집합을 구현합니다. 자세한 내용은 ADSI 서비스 공급자를 참조하세요.

LAN 관리자: LAN Manager 2를 실행하는 컴퓨터에 대한 호출인 경우 x, totalentries 매개 변수는 이력서 시퀀스의 위치에 관계없이 데이터베이스의 총 항목 수를 항상 반영합니다.

[in, out] resume_handle

기존 사용자 검색을 계속하는 데 사용되는 다시 시작 핸들이 포함된 값에 대한 포인터입니다. 핸들은 첫 번째 호출에서 0이어야 하며 후속 호출의 경우 변경되지 않은 상태로 유지되어야 합니다. 이 매개 변수가 NULL이면 다시 시작 핸들이 저장되지 않습니다.

반환 값

함수가 성공하면 반환 값이 NERR_Success.

함수가 실패하면 반환 값은 다음 오류 코드 중 하나일 수 있습니다.

반환 코드 설명
ERROR_ACCESS_DENIED
사용자는 요청한 정보에 대한 액세스 권한이 없습니다.
ERROR_INVALID_LEVEL
시스템 호출 수준이 올바르지 않습니다. 수준 매개 변수가 지원되지 않는 값으로 설정된 경우 이 오류가 반환됩니다.
NERR_BufTooSmall
버퍼가 너무 작아 항목을 포함할 수 없습니다. 버퍼에 정보가 기록되지 않았습니다.
NERR_InvalidComputer
컴퓨터 이름이 잘못된 경우
ERROR_MORE_DATA
더 많은 항목을 사용할 수 있습니다. 모든 항목을 받을 수 있을 만큼 큰 버퍼를 지정합니다.

설명

NetUserEnum 함수는 지정된 원격 서버 또는 로컬 컴퓨터의 모든 사용자 계정에 대한 정보를 검색합니다.

NetQueryDisplayInformation 함수를 사용하여 사용자 인터페이스에 표시할 사용자, 컴퓨터 또는 전역 그룹 계정 정보를 신속하게 열거할 수 있습니다.

Active Directory를 프로그래밍하는 경우 특정 ADSI(Active Directory Service Interface) 메서드를 호출하여 네트워크 관리 사용자 함수를 호출하여 달성할 수 있는 동일한 기능을 달성할 수 있습니다. 자세한 내용은 IADsUserIADsComputer를 참조하세요.

Active Directory를 실행하는 도메인 컨트롤러에서 NetUserEnum 함수를 호출하는 경우 보안 개체에 대한 ACL(액세스 제어 목록)에 따라 액세스가 허용되거나 거부됩니다. 기본 ACL은 "Pre-Windows 2000 호환 액세스" 그룹의 모든 인증된 사용자와 구성원이 정보를 볼 수 있도록 허용합니다. 멤버 서버 또는 워크스테이션에서 이 함수를 호출하는 경우 인증된 모든 사용자가 정보를 볼 수 있습니다. 이러한 플랫폼에서 익명 액세스 및 익명 액세스를 제한하는 방법에 대한 자세한 내용은 네트워크 관리 함수에 대한 보안 요구 사항을 참조하세요. ACL, ACL 및 액세스 토큰에 대한 자세한 내용은 Access Control 모델을 참조하세요.

NetUserEnum 함수는 호출자가 읽기 권한이 있는 정보만 반환합니다. 호출자는 Domain 개체에 대한 List Contents 액세스 권한이 있어야 하며 시스템 컨테이너에 있는 SAM Server 개체에서 전체 SAM 도메인 액세스를 열거해야 합니다.

LsaEnumerateTrustedDomains 또는 LsaEnumerateTrustedDomainsEx 함수를 사용하여 LSA(로컬 보안 기관) 정책 개체에서 신뢰할 수 있는 도메인의 이름과 SID를 검색할 수 있습니다.

NetUserEnum 함수는 모든 시스템 사용자를 반환하지 않습니다. NetUserAdd 함수를 호출하여 추가된 사용자만 반환합니다. 사용자 목록이 정렬된 순서로 반환된다는 보장은 없습니다.

NetUserEnum 함수를 호출하고 수준 매개 변수에 대해 정보 수준 1, 2 또는 3을 지정하면 검색된 각 구조의 암호 멤버가 NULL로 설정되어 암호 보안을 유지합니다.

사용자 계정 이름은 20자로 제한되고 그룹 이름은 256자로 제한됩니다. 또한 계정 이름은 마침표로 종료할 수 없으며 쉼표 또는 인쇄 가능한 문자 중 ", /, , [, ], :, |, <, , >+, =, ;, ?, *를 포함할 수 없습니다. 또한 이름은 인쇄할 수 없는 1-31 범위의 문자를 포함할 수 없습니다.

NetUserEnum 함수는 수준 매개 변수 4 및 USER_INFO_4 구조를 지원하지 않습니다. NetUserGetInfo 함수는 수준 매개 변수 4 및 USER_INFO_4 구조를 지원합니다.

예제

다음 코드 샘플에서는 NetUserEnum 함수를 호출하여 서버의 사용자 계정에 대한 정보를 검색하는 방법을 보여 줍니다. 샘플에서는 NetUserEnum을 호출하여 정보 수준 0(USER_INFO_0)을 지정하여 전역 사용자 계정만 열거합니다. 호출이 성공하면 코드는 항목을 반복하고 각 사용자 계정의 이름을 출력합니다. 마지막으로 코드 샘플은 정보 버퍼에 할당된 메모리를 해제하고 열거된 총 사용자를 출력합니다.

#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;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 lmaccess.h(Lm.h 포함)
라이브러리 Netapi32.lib
DLL Netapi32.dll

추가 정보

LsaEnumerateTrustedDomains

LsaEnumerateTrustedDomainsEx

NetQueryDisplayInformation

NetUserAdd

NetUserGetGroups

NetUserGetInfo

네트워크 관리 함수

네트워크 관리 개요

USER_INFO_0

USER_INFO_1

USER_INFO_10

USER_INFO_11

USER_INFO_2

USER_INFO_20

USER_INFO_23

USER_INFO_3

사용자 함수