¿Cómo puedo obtener el nombre de dominio de la máquina (si la máquina está en el hecho de unirse a un dominio)?

Y, por supuesto, si la máquina no está unido a un dominio de la función debe devolver

  • null, o
  • una cadena vacía, o
  • el nombre de la máquina, o
  • "."

Notas:

  • la NetGetJoinInformation Win32 función devuelve el legado nombre NetBIOS del dominio (por ejemplo,AVATOPIA), no en el nombre del dominio (por ejemplo,avatopia.local)

  • la USERDOMAIN variable de entorno devuelve el dominio del usuario que ha iniciado sesión, que puede ser diferente de la máquina; y también devuelve el legado nombre NetBIOS del dominio (por ejemplo,AVATOPIA)

  • la USERDNSDOMAIN variable de entorno devuelve el nombre de dominio del usuario que ha iniciado sesión, que puede ser diferente de la máquina

Microsoft tiene un artículo de knowledge base Cómo recuperar usuario actual y los nombres de dominio en Windows NT, Windows 2000 o Windows XP, que se basa en obtener el token de seguridad del usuario y llamar a LookupAccountSid.

  • la LookupAccountSid Win32 función devuelve el legado nombre NetBIOS del dominio (por ejemplo,AVATOPIA); y también devuelve el dominio del usuario que ha iniciado sesión, que puede ser diferente de la máquina

Actualización De Uno

también he probado a utilizar los Anuncios de objeto para enlazar a la IADs interfaz del dominio:

IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);

problema con este enfoque es que:

  • usted no puede obtener el nombre de dominio (sólo el nombre completo)
  • no funciona si el usuario no tiene permisos para consulta AD
  • no funciona si el usuario no es un usuario válido en active directory
  • sólo funciona para los dominios de Active Directory

Actualización De Dos:

Para que quede claro lo que quiero es:

Cómo obtener nombre de dominio de Windows?

Bono De Lectura

que el lenguaje que están utilizando para conseguirlo?
Código nativo, de modo que puede suponer C, C++, Delphi, C# con P/Invoke, montaje, etc. (que es una manera indirecta de decir que no estoy llamando desde el interior de un Lenguaje Común en tiempo de ejecución, o un tiempo de ejecución de Java, y no tienen acceso a el .NET Framework class library, o la biblioteca de clases de Java)
No es claro para mí por qué las referencias citadas son insuficientes?
Me doy cuenta de que estás queriendo hacer esto desde el código nativo, pero no System.DirectoryServices.ActiveDirectory.Domain.Rendimiento NETO de la información deseada?
La referencia que te refieres, el que consulta el dominio del usuario, el de la .NET, o el que devuelve el nombre NetBIOS?

OriginalEl autor Ian Boyd | 2012-03-20

3 Comentarios

  1. 13

    Aquí vamos:

    #include <Windows.h>
    #include <DSRole.h>
    
    #pragma comment(lib, "netapi32.lib")
    
    #include <stdio.h>
    
    int main(int argc, char ** argv)
    {
        DSROLE_PRIMARY_DOMAIN_INFO_BASIC * info;
        DWORD dw;
    
        dw = DsRoleGetPrimaryDomainInformation(NULL,
                                               DsRolePrimaryDomainInfoBasic,
                                               (PBYTE *)&info);
        if (dw != ERROR_SUCCESS)
        {
            wprintf(L"DsRoleGetPrimaryDomainInformation: %u\n", dw);
            return dw;
        }
    
        if (info->DomainNameDns == NULL)
        {
            wprintf(L"DomainNameDns is NULL\n");
        }
        else
        {
            wprintf(L"DomainNameDns: %s\n", info->DomainNameDns);
        }
    
        return 0;
    }

    Que una persona utiliza DsRoleGetPrimaryDomainInformation en el uso de producción debe considerar la posibilidad de llamar a DsRoleFreeMemory para liberar el bloque de memoria cuando la información ya no es necesario (como por discusión en los comentarios).

    La función devuelve tres diferentes nombres de dominio, por ejemplo:

    • Bosque de dominio Nombre de: por ejemplo, stackoverflow.com
    • Nombre de dominio DNS: por ejemplo, stackoverflow.com
    • De dominio NetBIOS Nombre: por ejemplo, STACKOVERFLOW

    Si la máquina no está unido a un dominio, tanto Bosque y dns están en blanco, con sólo el nombre de NetBios llenado con el nombre del grupo de trabajo, por ejemplo:

    • Bosque De Dominio Nombre De: null
    • Nombre de dominio DNS: por ejemplo, null
    • De dominio NetBIOS Nombre: por ejemplo, WORKGROUP

    La función también devuelve una bandera que indica si el equipo está unido a un dominio:

    • DsRole_RoleMemberWorkstation: estación de trabajo que es miembro de un dominio
    • DsRole_RoleMemberServer: servidor que es un miembro de un dominio
    • DsRole_RolePrimaryDomainController: controlador de dominio principal
    • DsRole_RoleBackupDomainController: copia de seguridad de controlador de dominio

    o no:

    • DsRole_RoleStandaloneWorkstation: estación de trabajo que no es un miembro de un dominio
    • DsRole_RoleStandaloneServer: servidor que no es un miembro de un dominio
    Para el registro, no he probado esto en un no-dominio de la máquina. Pero si no se comportan bien, sólo tiene que utilizar NetGetJoinInformation primero para comprobar si usted está en un dominio o no.
    Funciona de dominio no se unió a las máquinas, los equipos unidos a un dominio AD, Windows 2000, y las máquinas no conectadas a la red. creo que tenemos un ganador. sólo tengo que averiguar la diferencia entre el «nombre de dominio dns» y «bosque de nombre de dominio» – y cual es mi nombre de dominio (superuser.com/questions/403447/…)
    después de algunas consideraciones, me decidió a rodar su edición posterior. La llamada a DsRoleFreeMemory es redundante en este caso porque lo próximo que vamos a hacer es salir del programa, y en el código de producción que normalmente se desea mantener esta información de forma indefinida, por lo que no llame DsRoleFreeMemory entonces. Es una pequeña cantidad de datos, después de todo. La única razón por la que en la asignación dinámica de la memoria es que es de longitud variable.
    Gracias por tu comentario. Parece que DsRoleGetPrimaryDomainInformation NO devolverá información diferente en llamadas consecutivas. Borrado mi comentario anterior.
    en el caso general, usted quiere encontrar su dirección IP y hacer una consulta inversa de DNS. Hay Api para eso, pero no esta. 🙂 En su caso particular el uso de las Amazonas-datos específicos de la que probablemente es más sensible.

    OriginalEl autor Harry Johnston

  2. 5

    Utilizando GetComputerNameEx usted puede conseguir su nombre de equipo y el nombre de dominio.

    Ejemplo:

    TCHAR local[100];
    DWORD hstSize = sizeof(local);
    GetComputerNameEx(ComputerNameDnsDomain, local, &hstSize);

    Nota: ComputerNameDnsDomain da nombre de dominio y ComputerNameNetBIOS da locales de grupo de trabajo(equipo) nombre.

    OriginalEl autor Sanju Monu

  3. 0

    Usted puede obtener el nombre de dominio a través de WMI en el uso de la Win32_NTDomain clase. El enlace contiene enlaces a muestras de cómo interactuar con WMI.

    La consulta select * from Win32_NTDomain parece tomar alrededor de 15 segundos para volver; también no funciona en Windows 2000.
    WMI es lento y poco fiable. Mejor uso de la API nativa de GetComputerNameEx() como @Sanju-Monu sugerido. También GetComputerNameEx existe en Windows 2000.

    OriginalEl autor Bukes

Dejar respuesta

Please enter your comment!
Please enter your name here