Función NetUserEnum (lmaccess.h)

La función NetUserEnum recupera información sobre todas las cuentas de usuario de un servidor.

Sintaxis

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

Parámetros

[in] servername

Puntero a una cadena constante que especifica el nombre DNS o NetBIOS del servidor remoto en el que se va a ejecutar la función. Si este parámetro es NULL, se usa el equipo local.

[in] level

Especifica el nivel de información de los datos. Este parámetro puede ser uno de los valores siguientes.

Valor Significado
0
Devuelve nombres de cuenta de usuario. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_0 .
1
Devuelve información detallada sobre las cuentas de usuario. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_1 .
2
Devuelve información detallada sobre las cuentas de usuario, incluidos los niveles de autorización y la información de inicio de sesión. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_2 .
3
Devuelve información detallada sobre las cuentas de usuario, incluidos los niveles de autorización, la información de inicio de sesión, los RID para el usuario y el grupo principal e información de perfil. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_3 .
10
Devuelve los nombres y comentarios de usuario y cuenta. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_10 .
11
Devuelve información detallada sobre las cuentas de usuario. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_11 .
20
Devuelve el nombre y el identificador del usuario y varios atributos de cuenta. El parámetro bufptr apunta a una matriz de estructuras de USER_INFO_20 . Tenga en cuenta que en Windows XP y versiones posteriores, se recomienda usar USER_INFO_23 en su lugar.

[in] filter

Valor que especifica los tipos de cuenta de usuario que se van a incluir en la enumeración. Un valor de cero indica que se deben incluir todos los datos normales de usuario, confianza y cuenta de equipo.

Este parámetro también puede ser una combinación de los valores siguientes.

Valor Significado
FILTER_TEMP_DUPLICATE_ACCOUNT
Enumera los datos de la cuenta para los usuarios cuya cuenta principal está en otro dominio. Este tipo de cuenta proporciona acceso de usuario a este dominio, pero no a ningún dominio que confíe en este dominio. El Administrador de usuarios hace referencia a este tipo de cuenta como una cuenta de usuario local.
FILTER_NORMAL_ACCOUNT
Enumera los datos normales de la cuenta de usuario. Este tipo de cuenta está asociado a un usuario típico.
FILTER_INTERDOMAIN_TRUST_ACCOUNT
Enumera los datos de la cuenta de confianza entre dominios. Este tipo de cuenta está asociado a una cuenta de confianza para un dominio que confía en otros dominios.
FILTER_WORKSTATION_TRUST_ACCOUNT
Enumera los datos de la cuenta de confianza del servidor miembro o estación de trabajo. Este tipo de cuenta está asociado a una cuenta de equipo para un equipo que es miembro del dominio.
FILTER_SERVER_TRUST_ACCOUNT
Enumera los datos de la cuenta de máquina del servidor miembro. Este tipo de cuenta está asociado a una cuenta de equipo para un controlador de dominio de copia de seguridad que es miembro del dominio.

[out] bufptr

Puntero al búfer que recibe los datos. El formato de estos datos depende del valor del parámetro level .

El sistema asigna el búfer para estos datos y la aplicación debe llamar a la función NetApiBufferFree para liberar la memoria asignada cuando los datos devueltos ya no sean necesarios. Tenga en cuenta que debe liberar el búfer incluso si se produce un error en la función NetUserEnum con ERROR_MORE_DATA.

[in] prefmaxlen

Longitud máxima preferida, en bytes, de los datos devueltos. Si especifica MAX_PREFERRED_LENGTH, la función NetUserEnum asigna la cantidad de memoria necesaria para los datos. Si especifica otro valor en este parámetro, puede restringir el número de bytes que devuelve la función. Si el tamaño del búfer no es suficiente para contener todas las entradas, la función devuelve ERROR_MORE_DATA. Para obtener más información, consulte Búferes de funciones de administración de red y longitudes de búfer de funciones de administración de red.

[out] entriesread

Puntero a un valor que recibe el recuento de elementos enumerados realmente.

[out] totalentries

Puntero a un valor que recibe el número total de entradas que se podrían haber enumerado a partir de la posición de reanudación actual. Tenga en cuenta que las aplicaciones solo deben tener en cuenta este valor como sugerencia. Si la aplicación se comunica con un controlador de dominio de Windows 2000 o posterior, debe considerar el uso del proveedor LDAP ADSI para recuperar este tipo de datos de forma más eficaz. El proveedor LDAP ADSI implementa un conjunto de objetos ADSI que admiten varias interfaces ADSI. Para obtener más información, consulte Proveedores de servicios ADSI.

Administrador de LAN: Si la llamada es a un equipo que ejecuta LAN Manager 2. x, el parámetro totalentries siempre reflejará el número total de entradas de la base de datos independientemente de dónde se encuentra en la secuencia de reanudación.

[in, out] resume_handle

Puntero a un valor que contiene un identificador de reanudación que se usa para continuar una búsqueda de usuario existente. El identificador debe ser cero en la primera llamada y dejar sin cambios para las llamadas posteriores. Si este parámetro es NULL, no se almacena ningún identificador de reanudación.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto se NERR_Success.

Si se produce un error en la función, el valor devuelto puede ser uno de los siguientes códigos de error.

Código devuelto Descripción
ERROR_ACCESS_DENIED
El usuario no tiene acceso a la información pedida.
ERROR_INVALID_LEVEL
El nivel de llamada del sistema no es válido. Este error se devuelve si el parámetro level está establecido en un valor no admitido.
NERR_BufTooSmall
El búfer es demasiado pequeño para contener una entrada. No se ha escrito información en el búfer.
NERR_InvalidComputer
El nombre de equipo no es válido.
ERROR_MORE_DATA
Hay más entradas disponibles. Especifique un búfer suficientemente grande para recibir todas las entradas.

Comentarios

La función NetUserEnum recupera información sobre todas las cuentas de usuario en un servidor remoto especificado o en el equipo local.

La función NetQueryDisplayInformation se puede usar para enumerar rápidamente la información de cuenta de usuario, equipo o grupo global para mostrarla en interfaces de usuario.

Si está programando para Active Directory, puede llamar a determinados métodos de interfaz de servicio de Active Directory (ADSI) para lograr la misma funcionalidad que puede lograr llamando a las funciones de usuario de administración de red. Para obtener más información, consulte IADsUser e IADsComputer.

Si llama a la función NetUserEnum en un controlador de dominio que ejecuta Active Directory, se permite o se deniega el acceso en función de la lista de control de acceso (ACL) para el objeto protegible. La ACL predeterminada permite que todos los usuarios y miembros autenticados del grupo "Acceso compatible con Pre-Windows 2000" vean la información. Si llama a esta función en un servidor miembro o estación de trabajo, todos los usuarios autenticados pueden ver la información. Para obtener información sobre el acceso anónimo y restringir el acceso anónimo en estas plataformas, consulte Requisitos de seguridad para las funciones de administración de red. Para obtener más información sobre las ACL, los ACL y los tokens de acceso, consulte Access Control Model.

La función NetUserEnum solo devuelve información a la que el autor de la llamada tiene acceso de lectura. El autor de la llamada debe tener acceso List Contents al objeto Domain y Enumerar todo el acceso de dominio SAM en el objeto SAM Server ubicado en el contenedor System.

La función LsaEnumerateTrustedDomains o LsaEnumerateTrustedDomainsEx se puede usar para recuperar los nombres y los SID de dominios de confianza de un objeto de directiva de la Autoridad de seguridad local (LSA).

La función NetUserEnum no devuelve todos los usuarios del sistema. Devuelve solo los usuarios que se han agregado con una llamada a la función NetUserAdd . No hay ninguna garantía de que se devuelva la lista de usuarios en orden ordenado.

Si llama a la función NetUserEnum y especifica el nivel de información 1, 2 o 3, para el parámetro level , el miembro de contraseña de cada estructura recuperada se establece en NULL para mantener la seguridad de contraseña.

Los nombres de cuenta de usuario están limitados a 20 caracteres y los nombres de grupo están limitados a 256 caracteres. Además, los nombres de cuenta no se pueden terminar por un punto y no pueden incluir comas ni ninguno de los siguientes caracteres imprimibles: ", /, , [, ], :, |, <, >, +, =, ;, ?, *. Los nombres tampoco pueden incluir caracteres en el intervalo 1-31, que no son imprimibles.

La función NetUserEnum no admite un parámetro de nivel de 4 y la estructura USER_INFO_4 . La función NetUserGetInfo admite un parámetro de nivel de 4 y la estructura USER_INFO_4 .

Ejemplos

En el ejemplo de código siguiente se muestra cómo recuperar información sobre las cuentas de usuario de un servidor con una llamada a la función NetUserEnum . El ejemplo llama a NetUserEnum, especificando el nivel de información 0 (USER_INFO_0) para enumerar solo las cuentas de usuario globales. Si la llamada se realiza correctamente, el código recorre las entradas e imprime el nombre de cada cuenta de usuario. Por último, el ejemplo de código libera la memoria asignada para el búfer de información e imprime un total de los usuarios enumerados.

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

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado lmaccess.h (include Lm.h)
Library Netapi32.lib
Archivo DLL Netapi32.dll

Consulte también

LsaEnumerateTrustedDomains

LsaEnumerateTrustedDomainsEx

NetQueryDisplayInformation

NetUserAdd

NetUserGetGroups

NetUserGetInfo

Funciones de administración de red

Introducción a la administración de redes

USER_INFO_0

USER_INFO_1

USER_INFO_10

USER_INFO_11

USER_INFO_2

USER_INFO_20

USER_INFO_23

USER_INFO_3

Funciones de usuario