web-dev-qa-db-fra.com

Exception "Une référence a été renvoyée par le serveur" lors de l'accès à AD à partir de C #

DirectoryEntry oDE = new DirectoryEntry("LDAP://DC=Test1,DC=Test2,DC=gov,DC=lk");

using (DirectorySearcher ds = new DirectorySearcher(oDE))
{
    ds.PropertiesToLoad.Add("name");
    ds.PropertiesToLoad.Add("userPrincipalName");

    ds.Filter = "(&(objectClass=user))";

    SearchResultCollection results = ds.FindAll();

    foreach (SearchResult result in results)
    {
        Console.WriteLine("{0} - {1}",
            result.Properties["name"][0].ToString(),
            result.Properties["userPrincipalName"][0].ToString());
    }
}

Sur la ligne SearchResultCollection results = ds.FindAll();, je reçois une exception:

Une référence a été renvoyée par le serveur.

Pourquoi ai-je cette exception et que signifie-t-elle?

19
Gilly

C’est la réponse à la question.La raison de ce problème est ma chaîne LDAP était erronée.

    try
    {
        string adServer = ConfigurationManager.AppSettings["Server"];
        string adDomain = ConfigurationManager.AppSettings["Domain"];
        string adUsername = ConfigurationManager.AppSettings["AdiminUsername"];
        string password = ConfigurationManager.AppSettings["Password"];
        string[] dc = adDomain.Split('.');
        string dcAdDomain = string.Empty;

        foreach (string item in dc)
        {
            if (dc[dc.Length - 1].Equals(item))
                dcAdDomain = dcAdDomain + "DC=" + item;
            else
                dcAdDomain = dcAdDomain + "DC=" + item + ",";
        }

        DirectoryEntry de = new DirectoryEntry("LDAP://" + adServer + "/CN=Users," + dcAdDomain, adUsername, password);

        DirectorySearcher ds = new DirectorySearcher(de);

        ds.SearchScope = SearchScope.Subtree;

        ds.Filter = "(&(objectClass=User)(sAMAccountName=" + username + "))";

        if (ds.FindOne() != null)
            return true;
    }
    catch (Exception ex)
    {
        ExLog(ex);
    }
    return false;
4
Gilly

Le chemin que vous avez fourni n'était probablement pas correct. Regarde ça.

Je recommanderais l'article Howto: (Presque) tout dans Active Directory via C # qui m'a vraiment aidé par le passé à traiter avec AD.

16
Fred

Une référence est envoyée par un serveur AD lorsqu'il ne dispose pas des informations demandées, mais qu'il sait qu'un autre serveur dispose des informations. Il apparaît généralement dans un environnement de confiance où un DC peut faire référence à un DC dans un domaine approuvé.

Dans votre cas, vous ne spécifiez qu'un domaine et vous fiez à la recherche automatique du contrôleur de domaine à utiliser. Je pense que vous devriez essayer de savoir quel contrôleur de domaine est utilisé pour la requête et vérifier si celui-ci contient réellement les informations demandées.

Si vous fournissez plus d'informations sur votre configuration AD, y compris les approbations/sous-domaines, les catalogues globaux et les enregistrements de ressources DNS des contrôleurs de domaine, il vous sera plus facile de vous aider.

11
Anders Abel

Vous devrez peut-être également activer ReferralChasing sur DirectorySearcher - http://msdn.Microsoft.com/en-us/library/ms180884(VS.80).aspx

3
Brian Desmond

Avait le même problème et a réussi à le résoudre. 

Dans mon cas, j'avais un groupe AD dans le domaine de connexion actuel avec des membres (utilisateurs) d'un sous-domaine. Le serveur sur lequel j’exécutais le code ne pouvait pas accéder au contrôleur de domaine du sous-domaine (le serveur n’avait jamais eu besoin d’accéder au sous-domaine auparavant).

Je me suis débattu pendant un certain temps, car mon ordinateur de bureau pouvait accéder au domaine de sorte que tout semblait OK dans le plug-in MMC (Utilisateurs et ordinateurs Active Directory).

J'espère que ça aide quelqu'un d'autre.

2
Will

Je sais que cela peut paraître idiot, mais je l’ai récemment remarqué moi-même. Assurez-vous que le contrôleur de domaine n’est pas en lecture seule.

2
Rhodesie

Une référence renvoyée par le serveur indique généralement que l'adresse IP n'est pas hébergée par le domaine fourni dans la chaîne de connexion. Pour plus de détails, voir ce lien:

Le renvoi a été renvoyé au fournisseur AD

1
ozkary

Dans mon cas, je voyais des références lorsque j'accédais à AD via SSO avec un compte dans un domaine approuvé. Le problème a disparu lorsque je me suis connecté avec des informations d'identification explicites dans le domaine local.

c'est-à-dire que j'ai remplacé

DirectoryEntry de = new DirectoryEntry("blah.com");

avec

DirectoryEntry de = new DirectoryEntry("blah.com", "[email protected]", "supersecret");

et le problème est parti.

0
Mike Smith