C # Active Directory: ¿Obtener el nombre de dominio del usuario?

Sé que este tipo de preguntas se han hecho antes, pero otros métodos me están fallando en este momento.

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 AD para buscar. Recupera a todos los usuarios dentro de esos grupos dados, buscando recursivamente esos grupos para más grupos también. Cada usuario se agrega a otra lista de usuarios autenticados de 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 / nombre de usuario)

Entonces, si hay un usuario que es parte del dominio TEST, llamado Steve: TEST / steve es su inicio de sesión. Puedo encontrar a Steve en el AD, sin embargo, también necesito que se almacene "TEST" junto con su información de AD.

Una vez más, puedo encontrar a 'Steve' bien usando un buscador de directorios y la IP de LDAP que me dan, pero dada la IP de LDAP, ¿cómo puedo encontrar el nombre de dominio amigable?

Cuando intento el siguiente código, aparece un error al intentar acceder al '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;
    }

editar

Agregué este método de muestra para intentar una sugerencia pero recibo una excepción: "Error no especificado" cuando presiono la llamada "FindAll ()" en el buscador. La cadena que se pasa es: "CN = USUARIO DE PRUEBA, CN = Usuarios, 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;

Respuestas a la pregunta(4)

Su respuesta a la pregunta