다음을 통해 공유


NetServerEnum 함수(lmserver.h)

NetServerEnum 함수는 도메인에 표시되는 지정된 형식의 모든 서버를 나열합니다.

구문

NET_API_STATUS NET_API_FUNCTION NetServerEnum(
  [in, optional]      LMCSTR  servername,
  [in]                DWORD   level,
  [out]               LPBYTE  *bufptr,
  [in]                DWORD   prefmaxlen,
  [out]               LPDWORD entriesread,
  [out]               LPDWORD totalentries,
  [in]                DWORD   servertype,
  [in, optional]      LMCSTR  domain,
  [in, out, optional] LPDWORD resume_handle
);

매개 변수

[in, optional] servername

예약; 은 NULL이어야 합니다.

[in] level

요청된 데이터의 정보 수준입니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
100
서버 이름 및 플랫폼 정보를 반환합니다. bufptr 매개 변수는 SERVER_INFO_100 구조체의 배열을 가리킵니다.
101
서버 이름, 형식 및 관련 데이터를 반환합니다. bufptr 매개 변수는 SERVER_INFO_101 구조체의 배열을 가리킵니다.

[out] bufptr

데이터를 수신하는 버퍼에 대한 포인터입니다. 이 데이터의 형식은 수준 매개 변수의 값에 따라 달라집니다. 이 버퍼는 시스템에서 할당되며 NetApiBufferFree 함수를 사용하여 해제해야 합니다. 함수가 ERROR_MORE_DATA 실패하더라도 버퍼를 해제해야 합니다.

[in] prefmaxlen

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

[out] entriesread

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

[out] totalentries

네트워크에 표시되는 서버 및 워크스테이션의 총 수를 수신하는 값에 대한 포인터입니다. 애플리케이션은 이 값을 힌트로만 고려해야 합니다.

[in] servertype

열거형에서 반환할 서버 항목을 필터링하는 값입니다. 이 매개 변수는 Lmserver.h 헤더 파일에 정의된 다음 값의 조합일 수 있습니다.

의미
SV_TYPE_WORKSTATION
0x00000001
모든 워크스테이션.
SV_TYPE_SERVER
0x00000002
서버 서비스를 실행하는 모든 컴퓨터.
SV_TYPE_SQLSERVER
0x00000004
Microsoft SQL Server instance 실행하는 모든 서버
SV_TYPE_DOMAIN_CTRL
0x00000008
주 도메인 컨트롤러인 서버입니다.
SV_TYPE_DOMAIN_BAKCTRL
0x00000010
백업 도메인 컨트롤러인 모든 서버입니다.
SV_TYPE_TIME_SOURCE
0x00000020
Timesource 서비스를 실행하는 모든 서버입니다.
SV_TYPE_AFP
0x00000040
AFP(Apple File Protocol) 파일 서비스를 실행하는 모든 서버.
SV_TYPE_NOVELL
0x00000080
Novell 서버인 모든 서버입니다.
SV_TYPE_DOMAIN_MEMBER
0x00000100
LAN Manager 2.x 도메인 멤버인 모든 컴퓨터
SV_TYPE_PRINTQ_SERVER
0x00000200
인쇄 큐를 공유하는 모든 컴퓨터
SV_TYPE_DIALIN_SERVER
0x00000400
전화 접속 서비스를 실행하는 모든 서버.
SV_TYPE_XENIX_SERVER
0x00000800
Xenix 서버인 모든 서버입니다.
SV_TYPE_SERVER_UNIX
0x00000800
UNIX 서버인 모든 서버입니다. 이는 SV_TYPE_XENIX_SERVER 동일합니다.
SV_TYPE_NT
0x00001000
워크스테이션 또는 서버.
SV_TYPE_WFW
0x00002000
작업 그룹용 Windows를 실행하는 모든 컴퓨터.
SV_TYPE_SERVER_MFPN
0x00004000
Microsoft File and Print for NetWare 서비스를 실행하는 모든 서버.
SV_TYPE_SERVER_NT
0x00008000
도메인 컨트롤러가 아닌 모든 서버.
SV_TYPE_POTENTIAL_BROWSER
0x00010000
브라우저 서비스를 실행할 수 있는 모든 컴퓨터입니다.
SV_TYPE_BACKUP_BROWSER
0x00020000
브라우저 서비스를 백업으로 실행하는 컴퓨터입니다.
SV_TYPE_MASTER_BROWSER
0x00040000
master 브라우저 서비스를 실행하는 컴퓨터입니다.
SV_TYPE_DOMAIN_MASTER
0x00080000
도메인 master 브라우저를 실행하는 컴퓨터입니다.
SV_TYPE_SERVER_OSF
0x00100000
OSF/1을 실행하는 컴퓨터입니다.
SV_TYPE_SERVER_VMS
0x00200000
VMS(Open Virtual Memory System)를 실행하는 컴퓨터입니다.
SV_TYPE_WINDOWS
0x00400000
Windows를 실행하는 컴퓨터입니다.
SV_TYPE_DFS
0x00800000
DFS(분산 파일 시스템) 트리의 루트인 컴퓨터입니다.
SV_TYPE_CLUSTER_NT
0x01000000
도메인에서 사용할 수 있는 서버 클러스터입니다.
SV_TYPE_TERMINALSERVER
0x02000000
터미널 서버 서비스를 실행하는 서버입니다.
SV_TYPE_CLUSTER_VS_NT
0x04000000
도메인에서 사용할 수 있는 클러스터 가상 서버입니다.

Windows 2000: 이 값은 지원되지 않습니다.

SV_TYPE_DCE
0x10000000
IBM DSS(Directory 및 Security Services) 또는 동등한 컴퓨터를 실행하는 컴퓨터입니다.
SV_TYPE_ALTERNATE_XPORT
0x20000000
대체 전송을 통해 컴퓨터입니다.
SV_TYPE_LOCAL_LIST_ONLY
0x40000000
브라우저에서 목록에 유지 관리되는 모든 컴퓨터입니다. 다음 설명 섹션을 참조하세요.
SV_TYPE_DOMAIN_ENUM
0x80000000
주 도메인입니다.
SV_TYPE_ALL
0xFFFFFFFF
모든 서버. 이는 가능한 모든 서버를 반환하는 편리한 방법입니다.

[in, optional] domain

서버 목록을 반환할 도메인의 이름을 지정하는 상수 문자열에 대한 포인터입니다. 도메인 이름은 NetBIOS 도메인 이름(예: microsoft)이어야 합니다. NetServerEnum 함수는 DNS 스타일 이름(예: microsoft.com)을 지원하지 않습니다.

이 매개 변수가 NULL이면 기본 도메인이 암시됩니다.

[in, out, optional] resume_handle

예약; 를 0으로 설정해야 합니다.

반환 값

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

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

반환 코드/값 설명
ERROR_ACCESS_DENIED
5
액세스가 거부되었습니다.
ERROR_INVALID_PARAMETER
87
매개 변수가 올바르지 않습니다.
ERROR_MORE_DATA
234
더 많은 항목을 사용할 수 있습니다. 모든 항목을 수신할 수 있을 만큼 큰 버퍼를 지정합니다.
ERROR_NO_BROWSER_SERVERS_FOUND
6118
브라우저 서버를 찾을 수 없습니다.
ERROR_NOT_SUPPORTED
50
요청이 지원되지 않습니다.
NERR_RemoteErr
2127
서버에서 반환된 데이터가 없는 원격 오류가 발생했습니다.
NERR_ServerNotStarted
2114
서버 서비스가 시작되지 않았습니다.
NERR_ServiceNotInstalled
2184
서비스가 시작되지 않았습니다.
NERR_WkstaNotStarted
2138
워크스테이션 서비스가 시작되지 않았습니다. 로컬 워크스테이션 서비스는 하위 원격 서버와 통신하는 데 사용됩니다.

설명

NetServerEnum 함수는 도메인에 표시되는 지정된 형식의 모든 서버를 나열하는 데 사용됩니다. 예를 들어 애플리케이션은 NetServerEnum 을 호출하여 모든 도메인 컨트롤러만 나열하거나 SQL Server 인스턴스만 실행하는 모든 서버를 나열할 수 있습니다.

애플리케이션은 servertype 매개 변수의 다양한 서버 형식에 대한 비트 마스크를 결합하여 여러 형식을 나열합니다. 예를 들어 값은 SV_TYPE_WORKSTATION | SVTYPE_SERVER(0x00000003)는 SV_TYPE_WORKSTATION(0x00000001) 및 SV_TYPE_SERVER(0x00000002)에 대한 비트 마스크를 결합합니다.

특정 서버에 대한 자세한 정보가 필요한 경우 WNetEnumResource 함수를 호출합니다.

NetServerEnum 함수를 성공적으로 실행하려면 특별한 그룹 멤버 자격이 필요하지 않습니다.

SV_TYPE_LOCAL_LIST_ONLY 값을 지정하면 NetServerEnum 함수는 브라우저가 내부적으로 유지 관리하는 서버 목록을 반환합니다. 이는 master 브라우저(또는 과거에 master 브라우저였던 컴퓨터)에서만 의미가 있습니다. master 브라우저는 현재 네트워크의 서버 또는 워크스테이션이 될 수 있는 컴퓨터를 확인할 수 있는 권한이 있는 컴퓨터입니다.

servertype 매개 변수에 지정된 형식과 일치하는 서버를 찾을 수 없는 경우 NetServerEnum 함수는 bufptr 매개 변수를 NULL로 반환하고 entriesreadtotalentries 매개 변수가 가리키는 DWORD 값은 0으로 설정됩니다.

NetServerEnum 함수는 설치 및 실행 중인 브라우저 서비스에 따라 달라집니다. 브라우저 서버를 찾을 수 없으면 NetServerEnum 이 ERROR_NO_BROWSER_SERVERS_FOUND 실패합니다.

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

예제

다음 코드 샘플에서는 NetServerEnum 함수를 호출하여 도메인에 표시되는 모든 서버를 나열하는 방법을 보여 줍니다. 샘플은 정보 수준 101( SERVER_INFO_101)을 지정하여 NetServerEnum을 호출합니다. 서버가 있는 경우 샘플 코드는 항목을 반복하고 검색된 데이터를 출력합니다. 서버가 도메인 컨트롤러인 경우 서버를 PDC(주 도메인 컨트롤러) 또는 BDC(백업 도메인 컨트롤러)로 식별합니다. 또한 샘플은 사용 가능한 총 항목 수와 실제로 열거된 항목 수에 대한 힌트를 출력하여 모든 항목이 열거되지 않은 경우 사용자에게 경고합니다. 마지막으로 샘플은 정보 버퍼에 할당된 메모리를 해제합니다.

#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[])
{
    LPSERVER_INFO_101 pBuf = NULL;
    LPSERVER_INFO_101 pTmpBuf;
    DWORD dwLevel = 101;
    DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
    DWORD dwEntriesRead = 0;
    DWORD dwTotalEntries = 0;
    DWORD dwTotalCount = 0;
    DWORD dwServerType = SV_TYPE_SERVER;        // all servers
    DWORD dwResumeHandle = 0;
    NET_API_STATUS nStatus;
    LPWSTR pszServerName = NULL;
    LPWSTR pszDomainName = NULL;
    DWORD i;

    if (argc > 2) 
    {
        fwprintf(stderr, L"Usage: %s [DomainName]\n", argv[0]);
        exit(1);
    }
    // The request is not for the primary domain.
    //
    if (argc == 2)
        pszDomainName = argv[1];
    //
    // Call the NetServerEnum function to retrieve information
    //  for all servers, specifying information level 101.
    //
    nStatus = NetServerEnum(pszServerName,
                            dwLevel,
                            (LPBYTE *) & pBuf,
                            dwPrefMaxLen,
                            &dwEntriesRead,
                            &dwTotalEntries,
                            dwServerType, 
                            pszDomainName, 
                            &dwResumeHandle);
    //
    // If the call succeeds,
    //
    if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) {
        if ((pTmpBuf = pBuf) != NULL) {
            //
            // Loop through the entries and 
            //  print the data for all server types.
            //
            for (i = 0; i < dwEntriesRead; i++) {
                assert(pTmpBuf != NULL);

                if (pTmpBuf == NULL) {
                    fprintf(stderr, "An access violation has occurred\n");
                    break;
                }

                printf("\tPlatform: %d\n", pTmpBuf->sv101_platform_id);
                wprintf(L"\tName:     %s\n", pTmpBuf->sv101_name);
                printf("\tVersion:  %d.%d\n",
                       pTmpBuf->sv101_version_major,
                       pTmpBuf->sv101_version_minor);
                printf("\tType:     %d", pTmpBuf->sv101_type);
                //
                // Check to see if the server is a domain controller;
                //  if so, identify it as a PDC or a BDC.
                //
                if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_CTRL)
                    wprintf(L" (PDC)");
                else if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL)
                    wprintf(L" (BDC)");

                printf("\n");
                //
                // Also print the comment associated with the server.
                //
                wprintf(L"\tComment:  %s\n\n", pTmpBuf->sv101_comment);

                pTmpBuf++;
                dwTotalCount++;
            }
            // Display a warning if all available entries were
            //  not enumerated, print the number actually 
            //  enumerated, and the total number available.

            if (nStatus == ERROR_MORE_DATA) {
                fprintf(stderr, "\nMore entries available!!!\n");
                fprintf(stderr, "Total entries: %d", dwTotalEntries);
            }

            printf("\nEntries enumerated: %d\n", dwTotalCount);

        } else {
            printf("No servers were found\n");
            printf("The buffer (bufptr) returned was NULL\n");
            printf("  entriesread: %d\n", dwEntriesRead);
            printf("  totalentries: %d\n", dwEntriesRead);
        }

    } else
        fprintf(stderr, "NetServerEnum failed with error: %d\n", nStatus);
    //
    // Free the allocated buffer.
    //
    if (pBuf != NULL)
        NetApiBufferFree(pBuf);

    return 0;
}


요구 사항

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

추가 정보

NetQueryDisplayInformation

NetServerDiskEnum

네트워크 관리 함수

네트워크 관리 개요

SERVER_INFO_100

SERVER_INFO_101

서버 함수