Compartir a través de


Función DsGetDcNameW (dsgetdc.h)

La función DsGetDcName devuelve el nombre de un controlador de dominio en un dominio especificado. Esta función acepta criterios de selección de controladores de dominio adicionales para indicar la preferencia de un controlador de dominio con características concretas.

Sintaxis

DSGETDCAPI DWORD DsGetDcNameW(
  [in]  LPCWSTR                  ComputerName,
  [in]  LPCWSTR                  DomainName,
  [in]  GUID                     *DomainGuid,
  [in]  LPCWSTR                  SiteName,
  [in]  ULONG                    Flags,
  [out] PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
);

Parámetros

[in] ComputerName

Puntero a una cadena terminada en null que especifica el nombre del servidor para procesar esta función. Normalmente, este parámetro es NULL, que indica que se usa el equipo local.

[in] DomainName

Puntero a una cadena terminada en NULL que especifica el nombre del dominio o la partición de aplicación que se va a consultar. Este nombre puede ser un nombre de estilo DNS, por ejemplo, fabrikam.com o un nombre de estilo plano, por ejemplo, Fabrikam. Si se especifica un nombre de estilo DNS, el nombre se puede especificar con o sin un punto final.

Si el parámetro Flags contiene la marca DS_GC_SERVER_REQUIRED, domainName debe ser el nombre del bosque. En este caso, DsGetDcName produce un error si DomainName especifica un nombre que no es la raíz del bosque.

Si el parámetro Flags contiene la marca DS_GC_SERVER_REQUIRED y domainName es NULL, DsGetDcName intenta encontrar un catálogo global en el bosque del equipo identificado por ComputerName, que es el equipo local si ComputerName es NULL.

Si DomainName es NULL y el parámetro Flags no contiene la marca DS_GC_SERVER_REQUIRED, NombreDeEquipo se establece en el nombre de dominio predeterminado del dominio principal del equipo identificado por NombreDeEquipo.

[in] DomainGuid

Puntero a una estructura GUID de que especifica el guid de del dominio consultado. Si DomainGuid no se NULL y no se encuentra el dominio especificado por DomainName o ComputerName, DsGetDcName intenta localizar un controlador de dominio en el dominio que tiene el GUID especificado por DomainGuid.

[in] SiteName

Puntero a una cadena terminada en null que especifica el nombre del sitio donde debe existir físicamente el controlador de dominio devuelto. Si este parámetro es null, DsGetDcName intenta devolver un controlador de dominio en el sitio más cercano al sitio del equipo especificado por ComputerName. Este parámetro debe ser NULL, de forma predeterminada.

[in] Flags

Contiene un conjunto de marcas que proporcionan datos adicionales usados para procesar la solicitud. Este parámetro puede ser una combinación de los siguientes valores.

DS_AVOID_SELF

Cuando se llama desde un controlador de dominio, especifica que el nombre del controlador de dominio devuelto no debe ser el equipo actual. Si el equipo actual no es un controlador de dominio, se omite esta marca. Esta marca se puede usar para obtener el nombre de otro controlador de dominio en el dominio.

DS_BACKGROUND_ONLY

Si no se especifica la marca DS_FORCE_REDISCOVERY, esta función usa los datos del controlador de dominio almacenados en caché. Si los datos almacenados en caché tiene más de 15 minutos de antigüedad, la memoria caché se actualiza haciendo ping al controlador de dominio. Si se especifica esta marca, esta actualización se evita incluso si los datos almacenados en caché han expirado. Esta marca se debe usar si se llama periódicamente a la función DsGetDcName.

DS_DIRECTORY_SERVICE_PREFERRED

DsGetDcName intenta encontrar un controlador de dominio que admita funciones de servicio de directorio. Si un controlador de dominio que admite servicios de directorio no está disponible, DsGetDcName devuelve el nombre de un controlador de dominio de servicio que no es de directorio. Sin embargo, DsGetDcName solo devuelve un controlador de dominio de servicio que no es de directorio después de que el intento de encontrar un controlador de dominio de servicio de directorio agote el tiempo de espera.

DS_DIRECTORY_SERVICE_REQUIRED

Requiere que el controlador de dominio devuelto admita servicios de directorio.

DS_DIRECTORY_SERVICE_6_REQUIRED

Requiere que el controlador de dominio devuelto ejecute Windows Server 2008 o posterior.

DS_DIRECTORY_SERVICE_8_REQUIRED

Requiere que el controlador de dominio devuelto ejecute Windows Server 2012 o posterior.

DS_FORCE_REDISCOVERY

Fuerza la omisión de los datos del controlador de dominio almacenados en caché. Cuando no se especifica la marca de DS_FORCE_REDISCOVERY, DsGetDcName puede devolver datos del controlador de dominio almacenados en caché. Si se especifica esta marca, DsGetDcName no usará información almacenada en caché (si existe alguna), sino que realizará una detección de controlador de dominio nueva.

Esta marca no debe usarse en condiciones normales, ya que el uso de la información del controlador de dominio almacenado en caché tiene mejores características de rendimiento y ayuda a garantizar que todas las aplicaciones usen de forma coherente el mismo controlador de dominio. Esta marca solo se debe usar después de que la aplicación determine que el controlador de dominio devuelto por DsGetDcName (cuando se llama sin esta marca) no es accesible. En ese caso, la aplicación debe repetir el DsGetDcName llamada con esta marca para asegurarse de que se omite la información almacenada en caché sin usar (si existe) y se detecta un controlador de dominio accesible.

DS_GC_SERVER_REQUIRED

Requiere que el controlador de dominio devuelto sea un servidor de catálogo global para el bosque de dominios con este dominio como raíz. Si se establece esta marca y el parámetro DomainName no es null, DomainName debe especificar un nombre de bosque. Esta marca no se puede combinar con las marcas DS_PDC_REQUIRED o DS_KDC_REQUIRED.

DS_GOOD_TIMESERV_PREFERRED

DsGetDcName intenta encontrar un controlador de dominio que sea un servidor de hora confiable. El servicio de hora de Windows se puede configurar para declarar uno o varios controladores de dominio como un servidor horario confiable. Para obtener más información, consulte la documentación de servicio de hora de Windows. Esta marca está pensada para que solo la use el servicio de hora de Windows.

DS_IP_REQUIRED

Este parámetro indica que el controlador de dominio debe tener una dirección IP. En ese caso, DsGetDcName colocará la dirección del protocolo de Internet del controlador de dominio en el domainControllerAddress miembro de DomainControllerInfo.

DS_IS_DNS_NAME

Especifica que el parámetro domainName de es un nombre DNS. Esta marca no se puede combinar con la marca DS_IS_FLAT_NAME.

Especifique DS_IS_DNS_NAME o DS_IS_FLAT_NAME. Si no se especifica ninguna marca, DsGetDcName puede tardar más tiempo en encontrar un controlador de dominio porque puede tener que buscar tanto el estilo DNS como el nombre plano.

DS_IS_FLAT_NAME

Especifica que el parámetro DomainName es un nombre plano. Esta marca no se puede combinar con la marca DS_IS_DNS_NAME.

DS_KDC_REQUIRED

Requiere que el controlador de dominio devuelto esté ejecutando actualmente el servicio centro de distribución de claves Kerberos. Esta marca no se puede combinar con las marcas DS_PDC_REQUIRED o DS_GC_SERVER_REQUIRED.

DS_ONLY_LDAP_NEEDED

Especifica que el servidor devuelto es un servidor LDAP. El servidor devuelto no es necesariamente un controlador de dominio. Ningún otro servicio está implícito en estar presente en el servidor. El servidor devuelto no tiene necesariamente una configuración escritura contenedor ni un contenedor de esquemas grabable. Es posible que el servidor devuelto no se use necesariamente para crear o modificar principios de seguridad. Esta marca se puede usar con la marca DS_GC_SERVER_REQUIRED para devolver un servidor LDAP que también hospeda un servidor de catálogo global. El servidor de catálogo global devuelto no es necesariamente un controlador de dominio. Ningún otro servicio está implícito en estar presente en el servidor. Si se especifica esta marca, se omiten las marcas DS_PDC_REQUIRED, DS_TIMESERV_REQUIRED, DS_GOOD_TIMESERV_PREFERRED, DS_DIRECTORY_SERVICES_PREFERED, DS_DIRECTORY_SERVICES_REQUIREDy DS_KDC_REQUIRED.

DS_PDC_REQUIRED

Requiere que el controlador de dominio devuelto sea el controlador de dominio principal para el dominio. Esta marca no se puede combinar con las marcas DS_KDC_REQUIRED o DS_GC_SERVER_REQUIRED.

DS_RETURN_DNS_NAME

Especifica que los nombres devueltos en el domainControllerName de y DomainName miembros de DomainControllerInfo deben ser nombres DNS. Si un nombre DNS no está disponible, se devuelve un error. Esta marca no se puede especificar con la marca DS_RETURN_FLAT_NAME. Esta marca implica la marca DS_IP_REQUIRED.

DS_RETURN_FLAT_NAME

Especifica que los nombres devueltos en el DomainControllerName de y DomainName miembros de DomainControllerInfo deben ser nombres planos. Si un nombre plano no está disponible, se devuelve un error. Esta marca no se puede especificar con la marca DS_RETURN_DNS_NAME.

DS_TIMESERV_REQUIRED

Requiere que el controlador de dominio devuelto esté ejecutando actualmente el servicio de hora de Windows.

DS_TRY_NEXTCLOSEST_SITE

Cuando se especifica esta marca, DsGetDcName intenta encontrar un controlador de dominio en el mismo sitio que el autor de la llamada. Si no se encuentra ningún controlador de dominio, encontrará un controlador de dominio que puede proporcionar información de topología y llamar a DsBindToISTG para obtener un identificador de enlace, llame a DsQuerySitesByCost a través de UDP para determinar el "siguiente sitio más cercano" y, por último, almacenar en caché el nombre del sitio encontrado. Si no se encuentra ningún controlador de dominio en ese sitio, DsGetDcName recurre al método predeterminado de buscar un controlador de dominio.

Si esta marca se usa junto con un valor distinto de NULL en el parámetro de entrada SiteName, se inicia ERROR_INVALID_FLAGS.

Además, el tipo de búsqueda empleado con DS_TRY_NEXT_CLOSEST_SITE es específico del sitio, por lo que esta marca se omite si se usa junto con DS_PDC_REQUIRED. Por último, DS_TRY_NEXTCLOSEST_SITE se omite cuando se usa junto con DS_RETURN_FLAT_NAME porque usa NetBIOS para resolver el nombre, pero el dominio del controlador de dominio encontrado no coincidirá necesariamente con el dominio al que está unido el cliente.

Nota Esta marca está habilitada. Si habilita la configuración de directiva "Siguiente sitio más cercano", la siguiente ubicación del controlador de dominio del sitio más cercano se activará para la máquina en todos los adaptadores de red disponibles, pero no configurados. Si deshabilita la configuración de directiva, la siguiente ubicación del controlador de dominio del sitio más cercano no se usará de forma predeterminada para la máquina en todos los adaptadores de red disponibles, pero no configurados. Sin embargo, si se realiza una llamada de localizador de controlador de dominio mediante la marca de DS_TRY_NEXTCLOSEST_SITE explícitamente, DsGetDcName respeta el comportamiento siguiente del sitio más cercano. Si no establece esta configuración de directiva, la siguiente ubicación del controlador de dominio del sitio más cercano no se usará de forma predeterminada para la máquina en todos los adaptadores de red disponibles, pero no configurados. Si la marca DS_TRY_NEXTCLOSEST_SITE se usa explícitamente, se usará el comportamiento siguiente del sitio más cercano.
 

DS_WRITABLE_REQUIRED

Requiere que se pueda escribir el controlador de dominio devuelto; es decir, hospede una copia grabable del servicio de directorio.

DS_WEB_SERVICE_REQUIRED

Requiere que el controlador de dominio devuelto esté ejecutando actualmente el servicio web de Active Directory.

[out] DomainControllerInfo

Puntero a un valor de PDOMAIN_CONTROLLER_INFO que recibe un puntero a una estructura de DOMAIN_CONTROLLER_INFO que contiene datos sobre el controlador de dominio seleccionado. Esta estructura se asigna mediante DsGetDcName. El autor de la llamada debe liberar la estructura mediante la función de NetApiBufferFree cuando ya no sea necesario.

Valor devuelto

Si la función devuelve datos del controlador de dominio, el valor devuelto es ERROR_SUCCESS.

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

Observaciones

La función DsGetDcName se envía al servicio Netlogon en el equipo remoto especificado por ComputerName. Si ComputerName es null, la función se procesa en el equipo local.

DsGetDcName no comprueba que el nombre del controlador de dominio devuelto sea el nombre de un controlador de dominio real o un catálogo global. Si se requiere autenticación mutua, el autor de la llamada debe realizar la autenticación.

DsGetDcName no requiere ningún acceso determinado al dominio especificado. De forma predeterminada, esta función no garantiza que el controlador de dominio devuelto esté disponible actualmente. En su lugar, el autor de la llamada debe intentar usar el controlador de dominio devuelto. Si el controlador de dominio no está disponible, el autor de la llamada debe llamar a la función DsGetDcName de nuevo, especificando la marca DS_FORCE_REDISCOVERY.

tiempo de respuesta de

Al usar DsGetDcName tenga en cuenta los siguientes detalles de tiempo:
  • DsGetDcName realiza llamadas de red y puede tardar unos segundos hasta un minuto, en función del tráfico de red, la topología, la carga del controlador de dominio, etc.
  • NO se recomienda llamar a DsGetDcName desde una interfaz de usuario u otro subproceso crítico de tiempo.
  • El localizador de controladores de dominio usa lógica optimizada para proporcionar la información del controlador de dominio lo antes posible. También usa información almacenada en caché en el sitio para ponerse en contacto con el controlador de dominio más cercano.

notas de en la permanencia del controlador de dominio

En Active Directory Domain Services, la función de localizador de controladores de dominio está diseñada para que una vez que un cliente encuentre un controlador de dominio preferido, el cliente no buscará otro a menos que ese controlador de dominio deje de responder o se reinicie el cliente. Esto se conoce como "Permanencia del controlador de dominio". Dado que las estaciones de trabajo normalmente funcionan durante meses sin un problema o reinicio, una consecuencia no deseada de este comportamiento es que si un controlador de dominio determinado deja de funcionar por mantenimiento, todos los clientes conectados a él cambian sus conexiones a otro controlador de dominio. Pero cuando el controlador de dominio vuelve a funcionar, ningún cliente se vuelve a conectar a él porque los clientes no se reinician con mucha frecuencia. Esto puede provocar problemas de equilibrio de carga.

Anteriormente, la solución más común a este problema era implementar un script en cada máquina cliente a la que se llamaba periódicamente DsGetDcName con la marca DS_FORCE_REDISCOVERY. Se trata de una solución algo complicada, por lo que Windows Server 2008 y Windows Vista introdujeron un nuevo mecanismo que provocó problemas con la permanencia del controlador de dominio.

Siempre que DsGetDcName recupera un nombre de controlador de dominio de su memoria caché, comprueba si esta entrada almacenada en caché ha expirado y, si es así, descarta ese nombre de controlador de dominio e intenta volver a detectar un nombre de controlador de dominio. El intervalo de vida de una entrada almacenada en caché se controla mediante el valor de las siguientes claves del Registro.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\ForceRediscoveryInterval

y

Directivas dede software HKEY_LOCAL_MACHINENetlogonParámetrosForceRediscoveryInterval

Los valores de estas claves del Registro son de tipo REG_DWORD. Especifican la longitud en segundos antes de DsGetDcName deben intentar volver a detectar el nombre del controlador de dominio. El valor predeterminado es 43200 segundos (12 horas). Si el valor del ForceRediscoveryInterval entrada del Registro se establece en 0, el cliente siempre realiza el redescubrimiento. Si el valor se establece en 4294967295, la memoria caché nunca expira y el controlador de dominio almacenado en caché continúa usándose. Se recomienda no establecer el ForceRediscoveryInterval entrada del Registro en un valor inferior a 3600 segundos (60 minutos).

Nota La configuración del Registro de ForceRediscoveryInterval están habilitadas para la directiva de grupo. Si deshabilita la configuración de directiva, Forzar redescubrimiento usará de forma predeterminada para la máquina en cada intervalo de 12 horas. Si no establece esta configuración de directiva, Forzar redescubrimiento se usará de forma predeterminada para la máquina en cada intervalo de 12 horas, a menos que la configuración de la máquina local en el Registro sea un valor diferente.
 
Tenga en cuenta que si se especifica la marca DS_BACKGROUND_ONLY, DsGetDcName nunca intentará volver a detectar el nombre del controlador de dominio, ya que el punto de esa marca es forzar DsGetDcName usar el nombre del controlador de dominio almacenado en caché incluso si ha expirado.

seguimiento etw de en DsGetDcName

Para activar de seguimiento ETW para DsGetDcName, cree la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DCLocator\Tracing

La clave tendrá una estructura como se indica a continuación:

String ProcessName
  DWORD  PID <optional>

ProcessName debe ser el nombre completo, incluida la extensión del proceso para el que desea obtener información de seguimiento. PID solo se requiere cuando existen varios procesos con el mismo nombre. Si se define, solo se habilitará el proceso con ese PID para el seguimiento. No es posible realizar un seguimiento de solo 2 de 3 procesos (o más) con el mismo nombre. Puede habilitar una instancia o todas las instancias (cuando existen varias instancias con el mismo nombre de proceso y no se especifica PID, todas las instancias se habilitarán para el seguimiento).

Por ejemplo, esto realizaría un seguimiento de todas las instancias de App1.exe y App2.exe, pero solo la instancia de App3.exe que tiene un PID de 999:

App1.exe 
App2.exe
App3.exe
     PID 999

Ejecute el siguiente comando para iniciar la sesión de seguimiento:

tracelog.exe -start <nombre de sesión> -guid #cfaa5446-c6c4-4f5c-866f-31c9b55b962d -f <nombre de archivo> -flag <traceFlags>

nombre de sesión es el nombre especificado para la sesión de seguimiento. El guid de para el proveedor de seguimiento DCLocator es "cfaaa5446-c6c4-4f5c-866f-31c9b55b962d". nombre de archivo es el nombre del archivo de registro en el que se escriben los eventos. traceFlags es una o varias de las marcas siguientes que indican qué áreas se van a rastrear:

Bandera Valor hexadecimal Descripción
DCLOCATOR_MISC 0x00000002 Depuración varias
DCLOCATOR_MAILSLOT 0x00000010 Mensajes de mailslot
DCLOCATOR_SITE 0x00000020 Sitios
DCLOCATOR_CRITICAL 0x00000100 Errores importantes
DCLOCATOR_SESSION_SETUP 0x00000200 Mantenimiento de dominio de confianza
DCLOCATOR_DNS 0x00004000 Registro de nombres
DCLOCATOR_DNS_MORE 0x00020000 Registro detallado de nombres
DCLOCATOR_MAILBOX_TEXT 0x02000000 Mensajes detallados del buzón
DCLOCATOR_SITE_MORE 0x08000000 Sitios detallados
 

Ejecute el siguiente comando para detener la sesión de seguimiento:

tracelog.exe -stop <> sessionname

nombre de sesión es el mismo nombre que el nombre que usó al iniciar la sesión.

Nota La clave del Registro para el proceso que se realiza el seguimiento debe estar presente en el Registro en el momento en que se inicia la sesión de seguimiento. Cuando se inicia la sesión, el proceso comprobará si debe generar o no mensajes de seguimiento (en función de la presencia o ausencia de una clave del Registro para ese nombre de proceso y piD opcional). El proceso comprueba el registro solo al inicio de la sesión. Cualquier cambio en el registro que se produzca después de eso no tendrá ningún efecto en el seguimiento.
 

Nota

El encabezado dsgetdc.h define DsGetDcName como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.

Requisitos

Requisito Valor
cliente mínimo admitido Windows Vista
servidor mínimo admitido Windows Server 2008
de la plataforma de destino de Windows
encabezado de dsgetdc.h
biblioteca de NetApi32.lib
DLL de NetApi32.dll

Consulte también

DOMAIN_CONTROLLER_INFO

funciones del servicio de directorio de

DsGetSiteName

DsValidateSubnetName

GUID de

NetApiBufferFree

servicio de hora de Windows