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

データを受信するバッファーへのポインター。 このデータの形式は 、level パラメーターの値によって異なります。 このバッファーはシステムによって割り当てられ、 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 のインスタンスを実行するすべてのサーバー。
SV_TYPE_DOMAIN_CTRL
0x00000008
プライマリ ドメイン コントローラーであるサーバー。
SV_TYPE_DOMAIN_BAKCTRL
0x00000010
バックアップ ドメイン コントローラーであるすべてのサーバー。
SV_TYPE_TIME_SOURCE
0x00000020
Timesource サービスを実行するすべてのサーバー。
SV_TYPE_AFP
0x00000040
Apple ファイリング プロトコル (AFP) ファイル サービスを実行するすべてのサーバー。
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
マスター ブラウザー サービスを実行するコンピューター。
SV_TYPE_DOMAIN_MASTER
0x00080000
ドメイン マスター ブラウザーを実行するコンピューター。
SV_TYPE_SERVER_OSF
0x00100000
OSF/1 を実行するコンピューター。
SV_TYPE_SERVER_VMS
0x00200000
Open Virtual Memory System (VMS) を実行するコンピューター。
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 Directory and Security Services (DSS) または同等のサービスを実行するコンピューター。
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。

関数が失敗した場合、戻り値には次のいずれかのエラー コードを指定できます。

リターン コード/値 Description
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 関数は、ブラウザーが内部的に維持するサーバーの一覧を返します。 これは、マスター ブラウザー (または過去にマスター ブラウザーであったコンピューター) でのみ意味を持ちます。 マスター ブラウザーは、現在、ネットワーク上のサーバーまたはワークステーションにできるコンピューターを決定する権限を持つコンピューターです。

servertype パラメーターで指定された型に一致するサーバーが見つからない場合、NetServerEnum 関数は bufptr パラメーターを NULL として返し、entriesread パラメーターと totalentries パラメーターが指す DWORD 値は 0 に設定されます。

NetServerEnum 関数は、インストールおよび実行されているブラウザー サービスによって異なります。 ブラウザー サーバーが見つからない場合、 NetServerEnum はERROR_NO_BROWSER_SERVERS_FOUNDで失敗します。

Active Directory のプログラミングを行っている場合は、特定の Active Directory サービス インターフェイス (ADSI) メソッドを呼び出して、ネットワーク管理サーバー関数を呼び出すことで実現できるのと同じ機能を実現できる場合があります。 詳細については、「 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 (include Lm.h)
Library Netapi32.lib
[DLL] Netapi32.dll

こちらもご覧ください

NetQueryDisplayInformation

NetServerDiskEnum

ネットワーク管理機能

ネットワーク管理の概要

SERVER_INFO_100

SERVER_INFO_101

サーバー関数