Fonction NetServerEnum (lmserver.h)

La fonction NetServerEnum répertorie tous les serveurs du type spécifié qui sont visibles dans un domaine.

Syntaxe

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

Paramètres

[in, optional] servername

Réservés au; doit avoir la valeur NULL.

[in] level

Niveau d’informations des données demandées. Ce paramètre peut prendre les valeurs suivantes.

Valeur Signification
100
Retournez les noms de serveurs et les informations de plateforme. Le paramètre bufptr pointe vers un tableau de structures SERVER_INFO_100 .
101
Retournez les noms de serveurs, les types et les données associées. Le paramètre bufptr pointe vers un tableau de structures SERVER_INFO_101 .

[out] bufptr

Pointeur vers la mémoire tampon qui reçoit les données. Le format de ces données dépend de la valeur du paramètre de niveau . Cette mémoire tampon est allouée par le système et doit être libérée à l’aide de la fonction NetApiBufferFree . Notez que vous devez libérer la mémoire tampon même si la fonction échoue avec ERROR_MORE_DATA.

[in] prefmaxlen

Longueur maximale préférée des données retournées, en octets. Si vous spécifiez MAX_PREFERRED_LENGTH, la fonction alloue la quantité de mémoire requise pour les données. Si vous spécifiez une autre valeur dans ce paramètre, cela peut limiter le nombre d’octets retournés par la fonction. Si la taille de la mémoire tampon est insuffisante pour contenir toutes les entrées, la fonction retourne ERROR_MORE_DATA. Pour plus d’informations, consultez Mémoires tampons de fonction de gestionréseau et Longueurs de mémoire tampon des fonctions de gestion réseau.

[out] entriesread

Pointeur vers une valeur qui reçoit le nombre d’éléments réellement énumérés.

[out] totalentries

Pointeur vers une valeur qui reçoit le nombre total de serveurs et de stations de travail visibles sur le réseau. Notez que les applications doivent considérer cette valeur uniquement comme un indicateur.

[in] servertype

Valeur qui filtre les entrées de serveur à retourner à partir de l’énumération. Ce paramètre peut être une combinaison des valeurs suivantes définies dans le fichier d’en-tête Lmserver.h .

Valeur Signification
SV_TYPE_WORKSTATION
0x00000001
Toutes les stations de travail.
SV_TYPE_SERVER
0x00000002
Tous les ordinateurs qui exécutent le service Serveur.
SV_TYPE_SQLSERVER
0x00000004
Tout serveur qui exécute une instance de Microsoft SQL Server.
SV_TYPE_DOMAIN_CTRL
0x00000008
Serveur qui est le contrôleur de domaine principal.
SV_TYPE_DOMAIN_BAKCTRL
0x00000010
Tout serveur qui est un contrôleur de domaine de sauvegarde.
SV_TYPE_TIME_SOURCE
0x00000020
Tout serveur qui exécute le service Timesource.
SV_TYPE_AFP
0x00000040
Tout serveur qui exécute le service de fichiers AFP (Apple Filing Protocol).
SV_TYPE_NOVELL
0x00000080
Tout serveur qui est un serveur Novell.
SV_TYPE_DOMAIN_MEMBER
0x00000100
Tout ordinateur qui est membre du domaine LAN Manager 2.x.
SV_TYPE_PRINTQ_SERVER
0x00000200
Tout ordinateur qui partage une file d’attente d’impression.
SV_TYPE_DIALIN_SERVER
0x00000400
Tout serveur qui exécute un service rendez-vous.
SV_TYPE_XENIX_SERVER
0x00000800
Tout serveur qui est un serveur Xenix.
SV_TYPE_SERVER_UNIX
0x00000800
Tout serveur qui est un serveur UNIX. Il s’agit de la même SV_TYPE_XENIX_SERVER.
SV_TYPE_NT
0x00001000
Une station de travail ou un serveur.
SV_TYPE_WFW
0x00002000
Tout ordinateur qui exécute Windows pour Workgroups.
SV_TYPE_SERVER_MFPN
0x00004000
Tout serveur qui exécute le service Fichier et Impression Microsoft pour NetWare.
SV_TYPE_SERVER_NT
0x00008000
Tout serveur qui n’est pas un contrôleur de domaine.
SV_TYPE_POTENTIAL_BROWSER
0x00010000
Tout ordinateur qui peut exécuter le service de navigateur.
SV_TYPE_BACKUP_BROWSER
0x00020000
Ordinateur qui exécute un service de navigateur en tant que sauvegarde.
SV_TYPE_MASTER_BROWSER
0x00040000
Ordinateur qui exécute le service de navigateur master.
SV_TYPE_DOMAIN_MASTER
0x00080000
Ordinateur qui exécute le navigateur master domaine.
SV_TYPE_SERVER_OSF
0x00100000
Ordinateur qui exécute OSF/1.
SV_TYPE_SERVER_VMS
0x00200000
Un ordinateur qui exécute Open Virtual Memory System (VMS).
SV_TYPE_WINDOWS
0x00400000
Un ordinateur qui exécute Windows.
SV_TYPE_DFS
0x00800000
Ordinateur qui est la racine de l’arborescence du système de fichiers distribué (DFS).
SV_TYPE_CLUSTER_NT
0x01000000
Clusters de serveurs disponibles dans le domaine.
SV_TYPE_TERMINALSERVER
0x02000000
Un serveur exécutant le service Terminal Server.
SV_TYPE_CLUSTER_VS_NT
0x04000000
Serveurs virtuels de cluster disponibles dans le domaine.

Windows 2000 : Cette valeur n’est pas prise en charge.

SV_TYPE_DCE
0x10000000
Ordinateur qui exécute IBM Directory and Security Services (DSS) ou équivalent.
SV_TYPE_ALTERNATE_XPORT
0x20000000
Ordinateur qui passe par un autre transport.
SV_TYPE_LOCAL_LIST_ONLY
0x40000000
Tout ordinateur géré dans une liste par le navigateur. Consultez la section Remarques suivante.
SV_TYPE_DOMAIN_ENUM
0x80000000
Domaine principal.
SV_TYPE_ALL
0xFFFFFFFF
Tous les serveurs. Il s’agit d’une commodité qui renverra tous les serveurs possibles.

[in, optional] domain

Pointeur vers une chaîne constante qui spécifie le nom du domaine pour lequel une liste de serveurs doit être retournée. Le nom de domaine doit être un nom de domaine NetBIOS (par exemple, microsoft). La fonction NetServerEnum ne prend pas en charge les noms de style DNS (par exemple, microsoft.com).

Si ce paramètre a la valeur NULL, le domaine principal est implicite.

[in, out, optional] resume_handle

Réservés au; doit être défini sur zéro.

Valeur retournée

Si la fonction réussit, la valeur de retour est NERR_Success.

Si la fonction échoue, la valeur de retour peut être l’un des codes d’erreur suivants :

Code/valeur de retour Description
ERROR_ACCESS_DENIED
5
L’accès a été refusé.
ERROR_INVALID_PARAMETER
87
Le paramètre est incorrect.
ERROR_MORE_DATA
234
D’autres entrées sont disponibles. Spécifiez une mémoire tampon suffisamment grande pour recevoir toutes les entrées.
ERROR_NO_BROWSER_SERVERS_FOUND
6118
Aucun serveur de navigateur trouvé.
ERROR_NOT_SUPPORTED
50
La demande n'est pas prise en charge.
NERR_RemoteErr
2127
Une erreur distante s’est produite sans aucune donnée retournée par le serveur.
NERR_ServerNotStarted
2114
Le service serveur n’est pas démarré.
NERR_ServiceNotInstalled
2184
Le service n'a pas été démarré.
NERR_WkstaNotStarted
2138
Le service Station de travail n’a pas été démarré. Le service de station de travail local est utilisé pour communiquer avec un serveur distant de niveau inférieur.

Remarques

La fonction NetServerEnum est utilisée pour répertorier tous les serveurs du type spécifié qui sont visibles dans un domaine. Par exemple, une application peut appeler NetServerEnum pour répertorier uniquement tous les contrôleurs de domaine ou tous les serveurs qui exécutent des instances de SQL Server uniquement.

Une application combine les masques de bits pour différents types de serveurs dans le paramètre servertype pour répertorier plusieurs types. Par exemple, une valeur de SV_TYPE_WORKSTATION | SVTYPE_SERVER (0x00000003) combine les masques de bits pour les SV_TYPE_WORKSTATION (0x00000001) et les SV_TYPE_SERVER (0x00000002).

Si vous avez besoin d’informations supplémentaires pour un serveur spécifique, appelez la fonction WNetEnumResource .

Aucune appartenance à un groupe spécial n’est requise pour exécuter correctement la fonction NetServerEnum .

Si vous spécifiez la valeur SV_TYPE_LOCAL_LIST_ONLY, la fonction NetServerEnum retourne la liste des serveurs que le navigateur gère en interne. Cela n’a de sens que sur le navigateur master (ou sur un ordinateur qui a été le master navigateur dans le passé). Le navigateur master est l’ordinateur qui dispose actuellement des droits permettant de déterminer quels ordinateurs peuvent être des serveurs ou des stations de travail sur le réseau.

Si aucun serveur ne correspond aux types spécifiés dans le paramètre servertype , la fonction NetServerEnum retourne le paramètre bufptr en tant que valeurs NULL et DWORD pointées par les paramètres entriesread et totalntries sont définis sur zéro.

La fonction NetServerEnum dépend du service de navigateur en cours d’installation et d’exécution. Si aucun serveur de navigateur n’est trouvé, NetServerEnum échoue avec ERROR_NO_BROWSER_SERVERS_FOUND.

Si vous programmez pour Active Directory, vous pouvez peut-être appeler certaines méthodes ADSI (Active Directory Service Interface) pour obtenir la même fonction que celle que vous pouvez obtenir en appelant les fonctions du serveur d’administration réseau. Pour plus d’informations, consultez IADsComputer.

Exemples

L’exemple de code suivant montre comment répertorier tous les serveurs visibles dans un domaine avec un appel à la fonction NetServerEnum . L’exemple appelle NetServerEnum, en spécifiant le niveau d’informations 101 ( SERVER_INFO_101). Si des serveurs sont trouvés, l’exemple de code effectue une boucle dans les entrées et imprime les données récupérées. Si le serveur est un contrôleur de domaine, il identifie le serveur en tant que contrôleur de domaine principal (PDC) ou contrôleur de domaine de sauvegarde (BDC). L’exemple affiche également le nombre total d’entrées disponibles et un indicateur sur le nombre d’entrées réellement énumérées, indiquant à l’utilisateur si toutes les entrées n’ont pas été énumérées. Enfin, l’exemple libère la mémoire allouée pour la mémoire tampon d’informations.

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


Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête lmserver.h (include Lm.h)
Bibliothèque Netapi32.lib
DLL Netapi32.dll

Voir aussi

NetQueryDisplayInformation

NetServerDiskEnum

Fonctions de gestion réseau

Vue d’ensemble de la gestion du réseau

SERVER_INFO_100

SERVER_INFO_101

Fonctions serveur