2011-03-21 4 views
1

J'essaye de me lier à un serveur Active Directory en C# mais sur le site je semble avoir des problèmes non reproductibles dans l'environnement de test.ne peut pas se connecter à AD sans se connecter spécifiquement à un DC

Je reçois une exception

System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational. 
    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.RefreshCache() 
    at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName) 
    at System.DirectoryServices.DirectoryEntry.get_NativeGuid() 

le code ressemble à ceci

// domainStr = "LDAP://domainname/rootDSE 
using (var de = new DirectoryEntry(domainStr, Username, Password)) 
{ 
    var guid = de.NativeGuid; 
} 

si je tente de connecter le contrôleur de domaine à la place (ou domainStr = "LDAP://domainController/rootDSE" qualifié domainStr = "LDAP://domainController.DomainName") il fonctionne bien.

J'ai essayé

var d = Domain.GetDomain(new DirectoryContext(
      DirectoryContextType.Domain, 
      domainStr, 
      Username, 
      Password)); 

mais je reçois la même exception exacte lorsque vous faites cela. Je me demande si je fais quelque chose de mal, peut-être qu'une URL LDAP différente fonctionnerait mieux ou si c'est un problème commun que j'ai (bien que les recherches de google soulèvent ce problème je n'ai pas trouvé une solution cela fonctionne pour moi)

De même, il peut être utile de souligner que le serveur sur lequel le logiciel s'exécute n'est pas dans Active Directory et j'ai une liste des AD auxquels je me connecte (d'où le nom d'utilisateur et le mot de passe connect)

+0

Cette machine utilise-t-elle un membre "sur site" de ce domaine? Si ce n'est pas le cas, vous devrez spécifier un utilisateur de domaine spécifique + pwd pour pouvoir faire quoi que ce soit. Aussi, je crois que le bon chemin LDAP serait juste 'LDAP: // RootDSE' - est-ce que ça marche pour vous ?? –

+0

Je ne suis pas sûr de ce que vous voulez dire! mais sûr avec C#, vous pouvez vous connecter à AD en spécifiant DCs IP/Nom/Adresse même si votre machine n'est pas un membre du domaine. –

+0

La machine n'est pas membre du domaine (donc je ne peux pas simplement me connecter avec 'LDAP: // RootDSE'). Cependant, j'ai utilisé un nom d'utilisateur et un mot de passe lorsque j'essayais de me connecter, mais je reçois toujours l'exception ci-dessus à moins que je ne spécifie explicitement un contrôleur de domaine. – clows

Répondre

2

C'est parce que le serveur DNS n'a pas d'enregistrement A pour le domaine. Le serveur DNS ne sait pas à quelle adresse IP résoudre lorsque vous lui passez un nom de domaine. Normalement, vous n'avez pas ce problème car, par défaut, le serveur DNS intégré MS Windows ajoutera cet enregistrement A pour vous. Cependant, dans les grandes entreprises, très souvent, ils n'utilisent pas MS Windows intégré serveur DNS. Dans de nombreux cas, les utilisateurs ne prennent pas la peine d'ajouter un enregistrement A au nom de domaine.

Si possible, vous pouvez demander à votre client d'ajouter un enregistrement A au serveur DNS. Sinon, demandez au client de réparer le fichier c: \ windows \ system32 \ drivers \ etc \ hosts. Ensuite, ajoutez un enregistrement A ici. Vous pouvez juste le faire pointer vers l'un des contrôleurs de domaine. Cependant, cette approche n'est pas mise à l'échelle car les utilisateurs de différents sites vont tous résoudre le nom de domaine à la même adresse IP. Pour certains utilisateurs de sites distants, ils peuvent rencontrer des problèmes de lenteur.

Si vous souhaitez également résoudre le problème d'évolutivité, vous pouvez envisager d'emprunter l'identité de l'utilisateur au lieu de passer le mot de passe du nom d'utilisateur dans le DirectoryEntry. Une fois que vous avez emprunté l'identité d'un utilisateur de domaine, vous pouvez utiliser une liaison sans serveur comme celle-ci LDAP://RootDSE.

Questions connexes