Sé que este tipo de pregunta se ha hecho antes, pero otros métodos me están fallando en este momento.C# Active Directory: ¿Obtener el nombre de dominio del usuario?
Tal como está, nuestro servicio de Windows sondea AD, dado un LDAP (es decir, LDAP: //10.32.16.80) y una lista de grupos de usuarios dentro de ese servidor de AD para buscar. Recupera todos los usuarios dentro de esos grupos dados, buscando recursivamente esos grupos para más grupos también. Cada usuario se agrega a la lista de usuarios autenticados de otras aplicaciones.
Esta parte de la aplicación se está ejecutando correctamente. Sin embargo, necesitamos el nombre de dominio amigable de cada usuario (es decir, la parte de su nombre de usuario/DOMINIO)
Entonces, si hay un usuario que es parte del dominio TEST, llamado Steve: TEST/steve es su inicio de sesión . Puedo encontrar steve en el AD, sin embargo, también necesito que se almacene "TEST" junto con su información AD.
De nuevo, puedo encontrar 'steve' bien utilizando un buscador de directorio y la dirección IP de LDAP que me dieron, pero dado el IP de LDAP, ¿cómo puedo encontrar el nombre de dominio amigable?
Cuando intento el siguiente código que estoy señaliza un error al intentar acceder a la 'defaultNamingContext':
System.Runtime.InteropServices.COMException (0x8007202A): El mecanismo de autenticación es desconocido.
Aquí está el código:
private string SetCurrentDomain(string server)
{
string result = string.Empty;
try
{
logger.Debug("'SetCurrentDomain'; Instantiating rootDSE LDAP");
DirectoryEntry ldapRoot = new DirectoryEntry(server + "/rootDSE", username, password);
logger.Debug("'SetCurrentDomain'; Successfully instantiated rootDSE LDAP");
logger.Debug("Attempting to retrieve 'defaultNamingContext'...");
string domain = (string)ldapRoot.Properties["defaultNamingContext"][0]; //THIS IS WHERE I HIT THE COMEXCEPTION
logger.Debug("Retrieved 'defaultNamingContext': " + domain);
if (!domain.IsEmpty())
{
logger.Debug("'SetCurrentDomain'; Instantiating partitions/configuration LDAP entry");
DirectoryEntry parts = new DirectoryEntry(server + "/CN=Partitions,CN=Configuration," + domain, username, password);
logger.Debug("'SetCurrentDomain'; Successfully instantiated partitions/configuration LDAP entry");
foreach (DirectoryEntry part in parts.Children)
{
if (part.Properties["nCName"] != null && (string)part.Properties["nCName"][0] != null)
{
logger.Debug("'SetCurrentDomain'; Found property nCName");
if ((string)part.Properties["nCName"][0] == domain)
{
logger.Debug("'SetCurrentDomain'; nCName matched defaultnamingcontext");
result = (string)part.Properties["NetBIOSName"][0];
logger.Debug("'SetCurrentDomain'; Found NetBIOSName (friendly domain name): " + result);
break;
}
}
}
}
logger.Debug("finished setting current domain...");
}
catch (Exception ex)
{
logger.Error("error attempting to set domain:" + ex.ToString());
}
return result;
}
edición
añadí este método de muestra con el fin de intentar una sugerencia, pero estoy recibiendo una excepción: "Error no especificado" cuando pulso el "FindAll() "llamar al buscador. La cadena que se pasa in: "USER CN = TEST, CN = Users, DC = tempe, DC = ktregression, DC = com"
private string GetUserDomain(string dn)
{
string domain = string.Empty;
string firstPart = dn.Substring(dn.IndexOf("DC="));
string secondPart = "CN=Partitions,CN=Configuration," + firstPart;
DirectoryEntry root = new DirectoryEntry(secondPart, textBox2.Text, textBox3.Text);
DirectorySearcher searcher = new DirectorySearcher(root);
searcher.SearchScope = SearchScope.Subtree;
searcher.ReferralChasing = ReferralChasingOption.All;
searcher.Filter = "(&(nCName=" + firstPart + ")(nETBIOSName=*))";
try
{
SearchResultCollection rs = searcher.FindAll();
if (rs != null)
{
domain = GetProperty(rs[0], "nETBIOSName");
}
}
catch (Exception ex)
{
}
return domain;
¿El dominio 'TEST' está bajo el mismo bosque que el dominio actual? Si es así, puede consultar el dominio correcto para este usuario, ya que el usuario puede existir en su dominio actual, pero no en el otro. –
Sí, el dominio TEST estará en el mismo bosque que el dominio actual. En ese sentido, ¿cómo hago para consultar el dominio de un usuario determinado? Tenga en cuenta que mi conocimiento de AD es limitado, en el sentido de que no estoy muy familiarizado con la creación de cadenas de LDAP y ... –
posible duplicación de [Obtener dominio de estilo NT \ usuario dado DN] (http://stackoverflow.com/ preguntas/1796426/get-nt-style-domain-user-given-dn) - esto proporciona información sobre cómo convertir el DN de un usuario a su nombre de dominio NETBIOS, que es lo que quiere aquí. –