Partager via


NetUserEnum, fonction (lmaccess.h)

La fonction NetUserEnum récupère des informations sur tous les comptes d’utilisateur sur un serveur.

Syntaxe

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

Paramètres

[in] servername

Pointeur vers une chaîne constante qui spécifie le nom DNS ou NetBIOS du serveur distant sur lequel la fonction doit s’exécuter. Si ce paramètre a la valeur NULL, l’ordinateur local est utilisé.

[in] level

Spécifie le niveau d’informations des données. Ce paramètre peut prendre les valeurs suivantes.

Valeur Signification
0
Retournez les noms de compte d’utilisateur. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_0 .
1
Retournez des informations détaillées sur les comptes d’utilisateur. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_1 .
2
Retournez des informations détaillées sur les comptes d’utilisateur, notamment les niveaux d’autorisation et les informations d’ouverture de session. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_2 .
3
Retourne des informations détaillées sur les comptes d’utilisateur, notamment les niveaux d’autorisation, les informations d’ouverture de session, les ID pour l’utilisateur et le groupe principal et les informations de profil. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_3 .
10
Retournez les noms et les commentaires des utilisateurs et des comptes. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_10 .
11
Retournez des informations détaillées sur les comptes d’utilisateur. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_11 .
20
Retourne le nom et l’identificateur de l’utilisateur, ainsi que les différents attributs de compte. Le paramètre bufptr pointe vers un tableau de structures USER_INFO_20 . Notez que sur Windows XP et versions ultérieures, il est recommandé d’utiliser USER_INFO_23 à la place.

[in] filter

Valeur qui spécifie les types de comptes d’utilisateur à inclure dans l’énumération. La valeur zéro indique que toutes les données d’utilisateur, de confiance et de compte d’ordinateur normales doivent être incluses.

Ce paramètre peut également être une combinaison des valeurs suivantes.

Valeur Signification
FILTER_TEMP_DUPLICATE_ACCOUNT
Énumère les données de compte pour les utilisateurs dont le compte principal se trouve dans un autre domaine. Ce type de compte fournit à l’utilisateur l’accès à ce domaine, mais pas à tout domaine qui approuve ce domaine. Le Gestionnaire d’utilisateurs fait référence à ce type de compte en tant que compte d’utilisateur local.
FILTER_NORMAL_ACCOUNT
Énumère les données de compte d’utilisateur normales. Ce type de compte est associé à un utilisateur classique.
FILTER_INTERDOMAIN_TRUST_ACCOUNT
Énumère les données de compte d’approbation interdomaine. Ce type de compte est associé à un compte d’approbation pour un domaine qui approuve d’autres domaines.
FILTER_WORKSTATION_TRUST_ACCOUNT
Énumère les données de compte d’approbation de station de travail ou de serveur membre. Ce type de compte est associé à un compte d’ordinateur pour un ordinateur membre du domaine.
FILTER_SERVER_TRUST_ACCOUNT
Énumère les données du compte d’ordinateur du serveur membre. Ce type de compte est associé à un compte d’ordinateur pour un contrôleur de domaine de sauvegarde membre du domaine.

[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 .

La mémoire tampon de ces données est allouée par le système et l’application doit appeler la fonction NetApiBufferFree pour libérer la mémoire allouée lorsque les données retournées ne sont plus nécessaires. Notez que vous devez libérer la mémoire tampon même si la fonction NetUserEnum échoue avec ERROR_MORE_DATA.

[in] prefmaxlen

Longueur maximale préférée, en octets, des données retournées. Si vous spécifiez MAX_PREFERRED_LENGTH, la fonction NetUserEnum 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 d’entrées qui auraient pu être énumérées à partir de la position actuelle du CV. Notez que les applications doivent considérer cette valeur uniquement comme un indicateur. Si votre application communique avec un contrôleur de domaine Windows 2000 ou ultérieur, vous devez envisager d’utiliser le fournisseur LDAP ADSI pour récupérer ce type de données plus efficacement. Le fournisseur LDAP ADSI implémente un ensemble d’objets ADSI qui prennent en charge différentes interfaces ADSI. Pour plus d’informations, consultez Fournisseurs de services ADSI.

Gestionnaire lan : Si l’appel est à un ordinateur qui exécute LAN Manager 2. x, le paramètre totalntries reflète toujours le nombre total d’entrées dans la base de données, où qu’elle se trouve dans la séquence de cv.

[in, out] resume_handle

Pointeur vers une valeur qui contient un handle de CV utilisé pour poursuivre une recherche d’utilisateur existante. Le handle doit être égal à zéro lors du premier appel et rester inchangé pour les appels suivants. Si ce paramètre a la valeur NULL, aucun handle de reprise n’est stocké.

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 de retour Description
ERROR_ACCESS_DENIED
L’utilisateur n’a pas accès aux informations demandées.
ERROR_INVALID_LEVEL
Le niveau d’appel système est incorrect. Cette erreur est retournée si le paramètre de niveau est défini sur une valeur non prise en charge.
NERR_BufTooSmall
La mémoire tampon est trop petite pour contenir une entrée. Aucune information n’a été écrite dans la mémoire tampon.
NERR_InvalidComputer
Le nom d'ordinateur est non valide.
ERROR_MORE_DATA
D’autres entrées sont disponibles. Spécifiez une mémoire tampon suffisamment grande pour recevoir toutes les entrées.

Remarques

La fonction NetUserEnum récupère des informations sur tous les comptes d’utilisateur sur un serveur distant spécifié ou sur l’ordinateur local.

La fonction NetQueryDisplayInformation peut être utilisée pour énumérer rapidement les informations de compte d’utilisateur, d’ordinateur ou de groupe global à afficher dans les interfaces utilisateur .

Si vous programmez pour Active Directory, vous pouvez peut-être appeler certaines méthodes ADSI (Active Directory Service Interface) pour obtenir les mêmes fonctionnalités que celles que vous pouvez obtenir en appelant les fonctions utilisateur de gestion réseau. Pour plus d’informations, consultez IADsUser et IADsComputer.

Si vous appelez la fonction NetUserEnum sur un contrôleur de domaine qui exécute Active Directory, l’accès est autorisé ou refusé en fonction de la liste de contrôle d’accès (ACL) de l’objet sécurisable. La liste de contrôle d’accès par défaut permet à tous les utilisateurs authentifiés et aux membres du groupe « Accès compatible pré-Windows 2000 » d’afficher les informations. Si vous appelez cette fonction sur un serveur membre ou une station de travail, tous les utilisateurs authentifiés peuvent afficher les informations. Pour plus d’informations sur l’accès anonyme et la restriction de l’accès anonyme sur ces plateformes, consultez Exigences de sécurité pour les fonctions de gestion réseau. Pour plus d’informations sur les listes de contrôle d’accès, les ACL et les jetons d’accès, consultez Access Control Modèle.

La fonction NetUserEnum retourne uniquement les informations auxquelles l’appelant dispose d’un accès en lecture. L’appelant doit disposer d’un accès List Contents à l’objet Domain et énumérer l’accès au domaine SAM entier sur l’objet SAM Server situé dans le conteneur Système.

La fonction LsaEnumerateTrustedDomains ou LsaEnumerateTrustedDomainsEx peut être utilisée pour récupérer les noms et SID des domaines approuvés par un objet de stratégie LSA (Local Security Authority).

La fonction NetUserEnum ne retourne pas tous les utilisateurs système. Elle retourne uniquement les utilisateurs qui ont été ajoutés avec un appel à la fonction NetUserAdd . Il n’existe aucune garantie que la liste des utilisateurs sera retournée dans l’ordre trié.

Si vous appelez la fonction NetUserEnum et spécifiez le niveau d’informations 1, 2 ou 3 pour le paramètre de niveau , le membre de mot de passe de chaque structure récupérée a la valeur NULL pour maintenir la sécurité du mot de passe.

Les noms de compte d’utilisateur sont limités à 20 caractères et les noms de groupes sont limités à 256 caractères. En outre, les noms de compte ne peuvent pas être terminés par un point et ils ne peuvent pas inclure de virgules ou d’aucun des caractères imprimables suivants : « , /, , , [, ], :, |, <, , >+, =, ;, ?, *. Les noms ne peuvent pas non plus inclure des caractères de la plage 1 à 31, qui ne sont pas imprimables.

La fonction NetUserEnum ne prend pas en charge un paramètre de niveau 4 et la structure USER_INFO_4 . La fonction NetUserGetInfo prend en charge un paramètre de niveau 4 et la structure USER_INFO_4 .

Exemples

L’exemple de code suivant montre comment récupérer des informations sur les comptes d’utilisateur sur un serveur avec un appel à la fonction NetUserEnum . L’exemple appelle NetUserEnum, en spécifiant le niveau d’informations 0 (USER_INFO_0) pour énumérer uniquement les comptes d’utilisateurs globaux. Si l’appel réussit, le code boucle les entrées et imprime le nom de chaque compte d’utilisateur. Enfin, l’exemple de code libère la mémoire allouée pour la mémoire tampon d’informations et imprime un total des utilisateurs énumérés.

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

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 lmaccess.h (include Lm.h)
Bibliothèque Netapi32.lib
DLL Netapi32.dll

Voir aussi

LsaEnumerateTrustedDomains

LsaEnumerateTrustedDomainsEx

NetQueryDisplayInformation

NetUserAdd

NetUserGetGroups

NetUserGetInfo

Fonctions de gestion réseau

Vue d’ensemble de la gestion du réseau

USER_INFO_0

USER_INFO_1

USER_INFO_10

USER_INFO_11

USER_INFO_2

USER_INFO_20

USER_INFO_23

USER_INFO_3

Fonctions utilisateur