c# - Obtener nombre de dominio
.net sharepoint-2007 (6)
Mi computadora 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 yo quiero y devuelve exactamente el nombre de dominio que quiero (cuando estoy registrado como Administrador). Si el usuario no es un administrador del dominio, tengo una excepción de Access denied
.
¿Alguien sabe cómo obtener el dominio incluso con usuarios administradores que no son de dominio?
NOTA: Encontré 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 UserDomainName
solo devuelve something
.
¿Por qué estás usando WMI? ¿No puedes usar la funcionalidad .NET estándar?
System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
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 lo eché de menos a primera vista y pensé que alguien más podría hacer lo mismo.
Lo que la descripción de la pregunta pide es el nombre de dominio completo (FQDN) .
Sé que esto es viejo. Solo quería descargar esto aquí para cualquiera que esté buscando una respuesta para obtener un nombre de dominio. Esto está en coordinación con la respuesta de Peter. "Hay" un error según lo declarado por Rich. Pero, siempre puedes hacer una solución simple para eso. La forma en que puedo decir si todavía están en el dominio o no es haciendo ping al nombre de dominio. Si responde, continúa con lo que necesité para el dominio. Si falla, salgo y paso al modo "fuera de línea". Método simple de cadena.
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";
}
}
Si desea que usuarios específicos tengan acceso a todo o parte del espacio de objetos de WMI, debe autorizarlos tal como se muestra here . Tenga en cuenta que debe ejecutar como administrador para realizar esta configuración.
Voy a agregar una respuesta para tratar de aclarar algunas cosas aquí ya que parece haber algo de confusión. El problema principal es que las personas hacen la pregunta incorrecta, o al menos no son lo suficientemente específicas.
¿Qué significa realmente el "dominio" de una computadora?
Cuando hablamos del "dominio" de una computadora, hay varias cosas a las que nos podemos estar refiriendo. Lo que sigue no es una lista exhaustiva, pero cubre los casos más comunes:
- Un usuario o un principal de seguridad informática pueden pertenecer a un dominio de Active Directory.
- El sufijo de búsqueda DNS principal de la pila de red se puede denominar como el "dominio" de la computadora.
- Un nombre DNS que se resuelve en la dirección IP de la computadora puede denominarse "dominio" de la computadora.
¿Cuál quiero?
Esto depende en gran medida de lo que estás tratando de hacer. El póster original de esta pregunta buscaba 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 del usuario. En general, quiere estos cuando intenta hablar con Active Directory de alguna manera. Tenga en cuenta que el principal de usuario actual y el principal de la computadora actual no están necesariamente en el mismo dominio.
La respuesta de Pieter van Ginkel es darle 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%, probablemente sea el mismo dominio al que pertenecen el principal de seguridad de la computadora y el principal del usuario autenticado actualmente, pero no necesariamente . En 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, esto seguirá siendo una respuesta "suficientemente buena" para hablar con Active Directory.
La última opción, un nombre DNS, es mucho más confusa y más ambigua que las otras dos. En cualquier lugar entre cero e infinito, los registros DNS pueden resolverse en una dirección IP determinada, y no está necesariamente claro qué dirección IP le interesa. La respuesta de user2031519 se refiere al valor de HTTP_HOST
, que es especialmente útil para determinar cómo resolvió el usuario su HTTP servidor para enviar la solicitud que está procesando actualmente. Es casi seguro que esto no es lo que quiere si está tratando de hacer algo con Active Directory.
¿Cómo los obtengo?
Dominio del principal de seguridad de usuario actual
This es agradable y simple, es lo que te está dando la respuesta de Tim .
System.Environment.UserDomainName
Dominio del actual director de seguridad informática
This es probablemente lo que OP quería, en este vamos a tener que preguntarle a Active Directory al respecto.
System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()
Este arrojará una ActiveDirectoryObjectNotFoundException
si la máquina local no es parte del dominio, o no se puede contactar al controlador de dominio.
Sufijo DNS principal de la pila de red
This es lo que te está dando la respuesta de Pieter van Ginkel . Probablemente no sea exactamente lo que quiere, pero hay una buena posibilidad de que sea lo suficientemente bueno para usted; si no lo es, probablemente ya sepa por qué.
System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName
Nombre DNS que se resuelve en la dirección IP de la computadora
Este es complicado y no hay una sola respuesta. Si esto es lo que está buscando, comente a continuación y con gusto discutiremos su caso de uso y lo ayudaremos a encontrar la mejor solución (y ampliar esta respuesta en el proceso).
protected void Page_Init(object sender, EventArgs e)
{
String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
}