Funzione NetUserEnum (lmaccess.h)

La funzione NetUserEnum recupera informazioni su tutti gli account utente in un server.

Sintassi

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

Parametri

[in] servername

Puntatore a una stringa costante che specifica il nome DNS o NetBIOS del server remoto in cui deve essere eseguita la funzione. Se questo parametro è NULL, viene utilizzato il computer locale.

[in] level

Specifica il livello di informazioni dei dati. Questo parametro può avere uno dei valori seguenti.

Valore Significato
0
Restituisce i nomi degli account utente. Il parametro bufptr punta a una matrice di strutture USER_INFO_0 .
1
Restituisce informazioni dettagliate sugli account utente. Il parametro bufptr punta a una matrice di strutture USER_INFO_1 .
2
Restituisce informazioni dettagliate sugli account utente, inclusi i livelli di autorizzazione e le informazioni di accesso. Il parametro bufptr punta a una matrice di strutture USER_INFO_2 .
3
Restituisce informazioni dettagliate sugli account utente, inclusi livelli di autorizzazione, informazioni di accesso, RID per l'utente e il gruppo primario e informazioni sul profilo. Il parametro bufptr punta a una matrice di strutture USER_INFO_3 .
10
Restituisce i nomi e i commenti dell'utente e dell'account. Il parametro bufptr punta a una matrice di strutture USER_INFO_10 .
11
Restituisce informazioni dettagliate sugli account utente. Il parametro bufptr punta a una matrice di strutture USER_INFO_11 .
20
Restituisce il nome e l'identificatore dell'utente e vari attributi dell'account. Il parametro bufptr punta a una matrice di strutture USER_INFO_20 . Si noti che in Windows XP e versioni successive è consigliabile usare USER_INFO_23 .

[in] filter

Valore che specifica i tipi di account utente da includere nell'enumerazione . Il valore zero indica che devono essere inclusi tutti i dati normali dell'utente, del trust e dell'account del computer.

Questo parametro può anche essere una combinazione dei valori seguenti.

Valore Significato
FILTER_TEMP_DUPLICATE_ACCOUNT
Enumera i dati dell'account per gli utenti il cui account primario si trova in un altro dominio. Questo tipo di account fornisce l'accesso utente a questo dominio, ma non a un dominio che considera attendibile il dominio. Il gestore utenti fa riferimento a questo tipo di account come account utente locale.
FILTER_NORMAL_ACCOUNT
Enumera i dati normali dell'account utente. Questo tipo di account è associato a un utente tipico.
FILTER_INTERDOMAIN_TRUST_ACCOUNT
Enumera i dati dell'account di trust tra domini. Questo tipo di account è associato a un account di trust per un dominio che considera attendibili altri domini.
FILTER_WORKSTATION_TRUST_ACCOUNT
Enumera i dati dell'account dell'account trust della workstation o del server membro. Questo tipo di account è associato a un account computer per un computer membro del dominio.
FILTER_SERVER_TRUST_ACCOUNT
Enumera i dati dell'account del computer del server membro. Questo tipo di account è associato a un account computer per un controller di dominio di backup membro del dominio.

[out] bufptr

Puntatore al buffer che riceve i dati. Il formato di questi dati dipende dal valore del parametro level .

Il buffer per questi dati viene allocato dal sistema e l'applicazione deve chiamare la funzione NetApiBufferFree per liberare la memoria allocata quando i dati restituiti non sono più necessari. Si noti che è necessario liberare il buffer anche se la funzione NetUserEnum ha esito negativo con ERROR_MORE_DATA.

[in] prefmaxlen

Lunghezza massima preferita, in byte, dei dati restituiti. Se si specifica MAX_PREFERRED_LENGTH, la funzione NetUserEnum alloca la quantità di memoria necessaria per i dati. Se si specifica un altro valore in questo parametro, è possibile limitare il numero di byte restituiti dalla funzione. Se le dimensioni del buffer non sono sufficienti per contenere tutte le voci, la funzione restituisce ERROR_MORE_DATA. Per altre informazioni, vedere Buffer delle funzioni di gestione di rete e lunghezze del buffer delle funzioni di gestione di rete.

[out] entriesread

Puntatore a un valore che riceve il conteggio degli elementi effettivamente enumerati.

[out] totalentries

Puntatore a un valore che riceve il numero totale di voci che potrebbero essere state enumerate dalla posizione di ripresa corrente. Si noti che le applicazioni devono considerare questo valore solo come hint. Se l'applicazione comunica con un controller di dominio Windows 2000 o versione successiva, è consigliabile usare il provider LDAP ADSI per recuperare questo tipo di dati in modo più efficiente. Il provider LDAP ADSI implementa un set di oggetti ADSI che supportano varie interfacce ADSI. Per altre informazioni, vedere Provider di servizi ADSI.

Lan Manager: Se la chiamata è a un computer che esegue LAN Manager 2. x, il parametro totalentries rifletterà sempre il numero totale di voci nel database indipendentemente dal punto in cui si trova nella sequenza di ripresa.

[in, out] resume_handle

Puntatore a un valore che contiene un handle di ripresa utilizzato per continuare la ricerca di un utente esistente. L'handle deve essere zero nella prima chiamata e lasciare invariato per le chiamate successive. Se questo parametro è NULL, non viene archiviato alcun handle di ripresa.

Valore restituito

Se la funzione ha esito positivo, il valore restituito viene NERR_Success.

Se la funzione ha esito negativo, il valore restituito può essere uno dei codici di errore seguenti.

Codice restituito Descrizione
ERROR_ACCESS_DENIED
L'utente non ha accesso alle informazioni richieste.
ERROR_INVALID_LEVEL
Il livello di chiamata di sistema non è corretto. Questo errore viene restituito se il parametro level è impostato su un valore non supportato.
NERR_BufTooSmall
Il buffer è troppo piccolo per contenere una voce. Nessuna informazione scritta nel buffer.
NERR_InvalidComputer
Il nome del computer non è valido.
ERROR_MORE_DATA
Sono disponibili altre voci. Specificare un buffer sufficientemente grande per ricevere tutte le voci.

Commenti

La funzione NetUserEnum recupera informazioni su tutti gli account utente in un server remoto specificato o nel computer locale.

La funzione NetQueryDisplayInformation può essere usata per enumerare rapidamente le informazioni sull'account utente, computer o gruppo globale per la visualizzazione nelle interfacce utente.

Se si esegue la programmazione per Active Directory, è possibile chiamare determinati metodi ADSI (Active Directory Service Interface) per ottenere la stessa funzionalità che è possibile ottenere chiamando le funzioni utente di gestione di rete. Per altre informazioni, vedere IADsUser e IADsComputer.

Se si chiama la funzione NetUserEnum in un controller di dominio che esegue Active Directory, l'accesso è consentito o negato in base all'elenco di controllo di accesso (ACL) per l'oggetto a protezione diretta. L'elenco di controllo di accesso predefinito consente a tutti gli utenti autenticati e i membri del gruppo "Accesso compatibile con Pre-Windows 2000" di visualizzare le informazioni. Se si chiama questa funzione in un server membro o in una workstation, tutti gli utenti autenticati possono visualizzare le informazioni. Per informazioni sull'accesso anonimo e sulla limitazione dell'accesso anonimo in queste piattaforme, vedere Requisiti di sicurezza per le funzioni di gestione della rete. Per altre informazioni sugli elenchi di controllo di accesso, sugli ACL e sui token di accesso, vedere Controllo di accesso Modello.

La funzione NetUserEnum restituisce solo informazioni a cui il chiamante ha accesso in lettura. Il chiamante deve disporre dell'accesso al contenuto elenco all'oggetto Domain e enumera l'intero accesso al dominio SAM nell'oggetto SAM Server che si trova nel contenitore System.

La funzione LsaEnumerateTrustedDomains o LsaEnumerateTrustedDomainsEx può essere usata per recuperare i nomi e i SID dei domini attendibili da un oggetto criteri LSA (Local Security Authority).

La funzione NetUserEnum non restituisce tutti gli utenti di sistema. Restituisce solo gli utenti che sono stati aggiunti con una chiamata alla funzione NetUserAdd . Non vi è alcuna garanzia che l'elenco degli utenti verrà restituito in ordine ordinato.

Se si chiama la funzione NetUserEnum e si specificano informazioni livello 1, 2 o 3, per il parametro di livello , il membro password di ogni struttura recuperata è impostato su NULL per mantenere la sicurezza delle password.

I nomi degli account utente sono limitati a 20 caratteri e i nomi di gruppo sono limitati a 256 caratteri. Inoltre, i nomi degli account non possono essere terminati da un punto e non possono includere virgole o uno dei caratteri stampabili seguenti: ", /, , [, ], <>|, +, =, =, ;, ?, *. I nomi non possono includere anche caratteri nell'intervallo 1-31, che non sono stampabili.

La funzione NetUserEnum non supporta un parametro di livello pari a 4 e la struttura USER_INFO_4 . La funzione NetUserGetInfo supporta un parametro di livello 4 e la struttura USER_INFO_4 .

Esempio

L'esempio di codice seguente illustra come recuperare informazioni sugli account utente in un server con una chiamata alla funzione NetUserEnum . L'esempio chiama NetUserEnum, specificando il livello di informazioni 0 (USER_INFO_0) per enumerare solo gli account utente globali. Se la chiamata ha esito positivo, il codice scorre le voci e stampa il nome di ogni account utente. Infine, l'esempio di codice libera la memoria allocata per il buffer delle informazioni e stampa un totale degli utenti enumerati.

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

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione lmaccess.h (include Lm.h)
Libreria Netapi32.lib
DLL Netapi32.dll

Vedi anche

LsaEnumerateTrustedDomains

LsaEnumerateTrustedDomainsEx

NetQueryDisplayInformation

NetUserAdd

NetUserGetGroups

NetUserGetInfo

Funzioni di gestione della rete

Panoramica sulla gestione della rete

USER_INFO_0

USER_INFO_1

USER_INFO_10

USER_INFO_11

USER_INFO_2

USER_INFO_20

USER_INFO_23

USER_INFO_3

Funzioni utente