¿Cómo puedo detectar si mi programa se ejecuta en un entorno de Active Directory?¿Cómo puedo detectar si mi programa se ejecuta en un entorno de Active Directory?
estoy usando C# y .Net 2.0
¿Cómo puedo detectar si mi programa se ejecuta en un entorno de Active Directory?¿Cómo puedo detectar si mi programa se ejecuta en un entorno de Active Directory?
estoy usando C# y .Net 2.0
Una forma podría ser para consultar la variable ambiental LOGONSERVER. Eso le dará al servidor el nombre de su controlador AD ... que, hasta donde yo sé, estará en blanco (o coincidirá con la estación de trabajo actual? No estoy seguro) si no está actualmente conectado a un dominio.
Ejemplo de Uso:
string ADServer = Environment.GetEnvironmentVariable("LOGONSERVER");
Intente conseguir Environment.UserDomainName y comparándolo con Environment.MachineName. Si los dos son iguales, es probable que el usuario no tenga un dominio. Si no son lo mismo, el usuario inicia sesión en un dominio que debe tener un servidor de directorio.
De http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.path.aspx
para unirse al dominio actual mediante LDAP, utilice la ruta "LDAP: // RootDSE", a continuación, obtener el contexto de nomenclatura predeterminado y volver a enlazar la entrada.
Así que sin un dominio, el enlace a "LDAP: // RootDSE" debería fallar o no devolver nada. No lo probé por mí mismo.
use System.DirectoryServices; // add reference to system.directoryservices.dll
...
DirectoryEntry ent = new DirectoryEntry("LDAP://RootDSE");
String str = ent.Properties["defaultNamingContext"][0];
DirectoryEntry domain = new DirectoryEntry("LDAP://" + str);
Esta es sin duda una forma más limpia de la comprobación de un directorio activo de depender de una variable de entorno (que el usuario puede suprimir o añadir a suplantar el programa).
+1 Esto funciona, gracias. Lo único es que, cuando la máquina no es un miembro del dominio, espera unos 5 segundos antes de lanzar una COMException. Por lo tanto, puede ser mejor llamar 'Domain.GetComputerDomain()' o 'IPGlobalProperties.GetIPGlobalProperties(). DomainName' primero, luego, si eso tiene éxito, hazlo. – EMP
Este código comprueba si el ordenador en sí es un miembro de un dominio
using System.DirectoryServices.ActiveDirectory;
bool isDomain = false;
try
{
Domain.GetComputerDomain();
isDomain = true;
}
catch (ActiveDirectoryObjectNotFoundException)
{
}
Sin embargo, el ordenador puede estar en un dominio, pero el usuario actualmente conectado puede ser una cuenta de usuario local. Si desea comprobar para este uso la función Domain.GetCurrentDomain()
Me sale falso cuando estoy conectado con un usuario local, verdadero cuando estoy conectado con un usuario de dominio ... – vIceBerg
¿Qué pasa con un dominio NT4 sin un directorio activo? – VVS
Esto es bueno, pero no infalible: 'ActiveDirectoryObjectNotFoundException' también se lanza si el controlador de dominio no puede ser contactado por algún motivo, aunque la máquina sea un miembro del dominio. – EMP
he encontrado algo que funciona:
usando System.Net.NetworkInformation;
IPGlobalProperties.GetIPGlobalProperties(). DomainName;
Funciona con un usuario local y un usuario de dominio.
Parece prometedor, pero la observación en el documento es un poco preocupante: "Si una computadora local está registrada en un dominio y luego cambia a un grupo de trabajo, la propiedad DomainName devuelve el nombre de dominio anterior no el Empty" [http: // msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.domainname.aspx] – EMP
también será un nombre de máquina si la computadora no es parte de ningún dominio –