2010-11-26 19 views
8

Ce matin, j'ai découvert une bonne méthode (DirectoryEntry.Exists), qui devrait être en mesure de vérifier si un objet Active Directory existe sur le serveur. J'ai donc essayé avec un simple:Comment fournir DirectoryEntry.Exists avec les informations d'identification?

if (DirectoryEntry.Exists(path)) {} 

Bien sûr, il manque des surcharges pour fournir des informations d'identification. Parce que, si les informations d'identification ne sont pas fournies, j'obtiens cette exception:

Échec d'ouverture de session: nom d'utilisateur inconnu ou mauvais mot de passe. (System.DirectoryServices.DirectoryServicesCOMException)

est-il une autre option qui me donne la possibilité d'authentifier mon code sur le serveur AD? Ou pour vérifier l'existence d'un objet?

Répondre

13

Dans ce cas, vous ne pouvez pas utiliser la méthode statique Exists comme vous avez dit:

DirectoryEntry directoryEntry = new DirectoryEntry(path); 
directoryEntry.Username = "username"; 
directoryEntry.Password = "password"; 

bool exists = false; 
// Validate with Guid 
try 
{ 
    var tmp = directoryEntry.Guid; 
    exists = true; 
} 
catch (COMException) 
{ 
    exists = false; 
} 
+0

Ce serait ma solution préférée, mais cette propriété ne me semble pas statique, jetez un oeil: http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.username.aspx –

+0

Oh Je vois rien. Oui, vous devrez instancier un nouveau DirectoryEntry. Édité. – JoeBilly

+0

Merci pour un bel échantillon de code. Apparemment, c'est le seul moyen. C'est dommage que ce ne soit pas possible avec le défaut.méthodes net, mais au moins une bonne solution de contournement fait le travail! –

0

Si l'utilisateur qui a exécuté le processus n'a pas les autorisations pour appeler DirectoryEntry.Exists, vous pouvez utiliser l'emprunt d'identité.

Cela peut être utile (discute l'usurpation d'identité dans un contexte AD): http://www.codeproject.com/KB/system/everythingInAD.aspx

BTW, si vous avez déjà des informations d'identification d'un utilisateur qui a accès à tout ce dont vous avez besoin, pourquoi pas seulement le processus avec cet utilisateur (par exemple /courir comme)?

+0

Merci. Trouvé que comme aussi, mais ne me fournit pas une solution de descente à mon problème. Runas n'est vraiment pas une option dans mon projet actuel ... L'usurpation d'identité non plus, mais semble le meilleur jusqu'ici. –

1

donc répondre à la question: impossible.

Enfin écrire une méthode propre pour obtenir le DirectoryEntry par nom distingué, avec des informations d'identification spécifiées. Dans les deux cas d'existence/inexistence j'ai une instance de DirectoryEntry. Pour vérifier si c'est un objet valide retourné, je fais un simple essai ... catch pour voir s'il en résulte une exception. Si oui, c'est invalide.

Mauvais contrôle, mais cela fonctionne. Dommage que la méthode par défaut .net DirectoryEntry.Exists ne fournit pas une surcharge pour fournir des informations, tout comme le constructeur DirectoryEntry ...