Obtener nombre de dominio


Mi equipo está en un Dominio (Active Directory) y necesito obtener el nombre de dominio de forma dinámica. Encontré el siguiente código en Internet:

SelectQuery query = new SelectQuery("Win32_ComputerSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    foreach (ManagementObject mo in searcher.Get())
    {
        if ((bool)mo["partofdomain"])
        {
            this.Domain = mo["domain"].ToString();
            break;
        }
    }
 }

Funciona exactamente como quiero y devuelve exactamente el nombre de dominio que quiero (cuando estoy registrado como Administrador). Si el usuario no es un Administrador de Dominio, tengo una excepción Access denied.

¿Alguien sabe cómo obtener el dominio incluso con usuarios que no son administradores de dominios?

NOTA: he encontrado esta solución en Internet System.Environment.UserDomainName; pero solo me da una parte del nombre de dominio.

Es decir, mi dominio es: something.domain.com y el UserDomainName devuelve solo something.

Author: Gareth, 2010-11-12

6 answers

¿Por qué está usando WMI? ¿No puedes usar la funcionalidad estándar de. NET?

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
 85
Author: Pieter van Ginkel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-12 16:46:06

Encontré esta pregunta por el título. Si alguien más está buscando la respuesta sobre cómo obtener el nombre de dominio, use la siguiente variable de entorno.

System.Environment.UserDomainName

Soy consciente de que el autor de la pregunta menciona esto, pero me lo perdí a primera vista y pensé que alguien más podría hacer lo mismo.

Lo que la descripción de la pregunta entonces pedir es el nombre de dominio completo (FQDN).

 13
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 07:29:12

Voy a agregar una respuesta para tratar de aclarar algunas cosas aquí, ya que parece haber cierta confusión. El problema principal es que la gente está haciendo la pregunta equivocada, o al menos no es lo suficientemente específica.

¿Qué significa realmente el "dominio" de una computadora ?

Cuando hablamos del "dominio" de una computadora, hay varias cosas a las que podríamos estar refiriéndonos. Lo que sigue no es una lista exhaustiva, pero cubre los casos más comunes:

  • Un usuario o principal de seguridad informática puede pertenecer a un dominio de Active Directory.
  • El sufijo de búsqueda DNS principal de la pila de red puede denominarse "dominio"del equipo.
  • Un nombre DNS que se resuelve en la dirección IP del equipo puede denominarse "dominio"del equipo.

¿Cuál quiero?

Esto es altamente dependiente de lo que usted está tratando de hacer. El póster original de esta pregunta estaba buscando el "dominio de Active Directory" de la computadora", lo que probablemente significa que están buscando el dominio al que pertenece el principal de seguridad de la computadora o el principal de seguridad de un usuario. Generalmente los desea cuando intenta hablar con Active Directory de alguna manera. Tenga en cuenta que el principal de usuario actual y el principal de equipo actual no están necesariamente en el mismo dominio.

La respuesta de Pieter van Ginkel en realidad le está dando el sufijo DNS primario de la pila de red local (lo mismo que se muestra en la sección superior de la salida de ipconfig /all). En el caso del 99%, esto es probablemente lo mismo que el dominio al que pertenecen tanto el principal de seguridad del equipo como el principal del usuario actualmente autenticado - pero no necesariamente. Por lo general, esto es lo que desea cuando intenta hablar con dispositivos en la LAN, independientemente de si los dispositivos tienen algo que ver con Active Directory o no. Para muchas aplicaciones, esta seguirá siendo una respuesta" suficientemente buena " para hablar con Active Directory.

El la última opción, un nombre DNS, es mucho más borrosa y ambigua que las otras dos. En cualquier lugar entre cero e infinito los registros DNS pueden resolver a una dirección IP dada , y no necesariamente está claro qué dirección IP le interesa. la respuesta de user2031519 se refiere al valor de HTTP_HOST, que es específicamente útil para determinar cómo el usuario resolvió su servidor HTTP para enviar la solicitud que está procesando actualmente. Esto es casi seguro que no es lo que quieres si están tratando de hacer cualquier cosa con Active Directory.

¿Cómo los obtengo?

Dominio del principal de seguridad del usuario actual

Este es agradable y simple, es lo que la respuesta de Tim te está dando.

System.Environment.UserDomainName

Dominio del principal de seguridad informática actual

Esto es probablemente lo que el OP quería, para esto vamos a tener que preguntar a Active Directory al respecto.

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

Este lanzará un ActiveDirectoryObjectNotFoundException si la máquina local no forma parte del dominio o no se puede contactar con el controlador de dominio.

Sufijo DNS principal de la pila de red

Esto es lo que la respuesta de Pieter van Ginkel te está dando. Probablemente no sea exactamente lo que quieres, pero es muy probable que sea lo suficientemente bueno para ti; si no lo es, probablemente ya sepas por qué.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName

Nombre DNS que resuelve la dirección IP del equipo

Este es complicado y no hay una respuesta única para se. Si esto es lo que está después, comentario a continuación y que me estará encantado de discutir su caso de uso y ayudarle a encontrar la mejor solución (y ampliar esta respuesta en el proceso).

 12
Author: DaveRandom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-15 14:29:15

Si desea que usuarios específicos tengan acceso a todo o parte del espacio de objetos WMI, debe darles permiso como se muestra aquí. Tenga en cuenta que tiene que estar funcionando como administrador para realizar esta configuración.

 1
Author: Steve Townsend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-12 03:04:21

Sé que esto es viejo. Sólo quería tirar esto aquí para cualquiera que estuviera buscando una respuesta para conseguir un nombre de dominio. Esto está en coordinación con la respuesta de Pedro. "Hay" un error según lo declarado por Rich. Pero, siempre se puede hacer una solución simple para eso. La forma en que puedo saber si todavía están en el dominio o no es haciendo ping al nombre de dominio. Si responde, continuar con lo que necesitaba el dominio para. Si falla, salgo y entro en modo "sin conexión". Simple método string.

 string GetDomainName()
    {
        string _domain = IPGlobalProperties.GetIPGlobalProperties().DomainName;

        Ping ping = new Ping();

        try
        {
            PingReply reply = ping.Send(_domain);

            if (reply.Status == IPStatus.Success)
            {
                return _domain;
            }
            else
            {
                return reply.Status.ToString();
            }
        }
        catch (PingException pExp)
        {
            if (pExp.InnerException.ToString() == "No such host is known")
            {
                return "Network not detected!";
            }

            return "Ping Exception";
        }
    }
 1
Author: IamBatman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-19 16:31:46
 protected void Page_Init(object sender, EventArgs e)
 {
   String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
 }
 0
Author: user2031519,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-25 12:44:56