J’ai le code suivant (C #):
(Tweaked from: http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=31766050 )
DirectorySearcher dseSearcher = new DirectorySearcher(); ssortingng rootDSE = dseSearcher.SearchRoot.Path; DirectoryEntry rootDE = new DirectoryEntry(rootDSE); ssortingng userDSE = rootDSE.Insert(7, "OU=Users,"); DirectoryEntry userDE = new DirectoryEntry(userDSE);
Le rootDSE
est créé correctement, cependant, l’utilisateur userDSE
est inutilisable et userDSE
une userDSE
“Il n’y a pas d’object de ce type sur le serveur” si j’essaie de l’utiliser.
Les chaînes LDAP sont les suivantes:
Racine: LDAP: // DC = entreprise, DC = local
Utilisateur: LDAP: // OU = Utilisateurs, DC = entreprise, DC = local
Je travaille sous Vista en tant qu’administrateur, mais j’ai également besoin de cette fonctionnalité pour XP (administrateur).
LDAP et la gestion des annuaires, que je connais pour la première fois, je trébuche dans l’obscurité. Des pensées? De plus, tous les articles à relier qui pourraient me donner un aperçu de la façon dont tout cela fonctionne seraient appréciés.
La première chose que je voudrais essayer comme test est de coder en dur le chemin souhaité lorsque vous créez une entrée de répertoire comme ceci:
DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local");
Cela vous dira assez rapidement s’il s’agit d’un chemin réel dans votre Active Directory. Je ne sais pas à quoi ressemble votre AD, je ne peux donc pas vous dire s’il s’agit d’un chemin valide ou non. Sous votre plug-in Utilisateurs et ordinateurs MMC Active Directory, si ce chemin est correct, vous devez avoir votre domaine racine et un dossier OU sous la racine, appelé Utilisateurs.
Les chemins sont générés à l’envers dans AD. Par conséquent, si votre dossier Utilisateurs se trouve sous une autre unité d’organisation, il ne le serait pas.
DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=,DC=company,DC=local");
Donc, votre schéma AD ressemblerait à ceci:
Root | --> | -->Users
Un excellent article sur la gestion de Active Directory dans .NET:
Comment: faire (presque) tout dans Active Directory via C #
Vous pouvez également rechercher les espaces de noms System.DirectoryServices, System.DirectoryServices.ActiveDirectory et System.DirectoryServices.AccountManagement fournis dans .Net 3.5 Framework. Je crois que les espaces de noms System.DirectoryServices et ActiveDirctory étaient disponibles dans .Net 1.1. AccountManagement a été introduit dans .Net 3.5.
Documentation Microsoft – Beaucoup de liens utiles sur l’utilisation de l’espace de noms
Addenda:
Pour trouver réellement un utilisateur dans AD, vous souhaiterez procéder comme suit:
DirectoryEntry de = new DirectoryEntry(); de.Path = "LDAP://DC=company,DC=local"; de.AuthenticationType = AuthenticationTypes.Secure; DirectorySearcher deSearch = new DirectorySearcher(); deSearch.SearchRoot = de; deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))"; SearchResult result = deSearch.FindOne(); if (result != null) { DirectoryEntry deUser = new DirectoryEntry(result.Path); ... do what ever you need to the deUser deUser.Close(); }
Cela peut sembler stupide et stupide, mais la configuration par défaut de l’arborescence dans Active Directory n’est pas OU = utilisateurs , dc = domaine, dc = com mais plutôt cn = Utilisateurs , dc = domaine, dc = com (notez que CN = pas l’OU = pour les utilisateurs.
Cela semble stupide puisqu’un object conteneur (objectClass of cn) dans AD ne peut pas être le destinataire d’une stratégie de groupe, mais pour des raisons que je ne comprends pas, il s’agit de la valeur par défaut. (en fait, je comprends, c’est parce que le confinement d’un CN est plus semblable à un domaine NT qu’à l’OU)
Obtient presque tout le monde que je rencontre, la première fois qu’ils essaient de lier / authentifier LDAP à AD.
Comme geoffc l’a mentionné correctement, dans Active Directory, les “utilisateurs” du domaine sont un object conteneur plutôt qu’un object d’unité d’organisation. Cela se traduit par un chemin LDAP totalement différent, raison pour laquelle vous obtenez le message d’erreur.
Essayez le code suivant et publiez-le s’il résout votre problème:
// Replace the "company" and "com" with actual domain values... DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com"); DirectorySearcher deSearch = new DirectorySearcher(); deSearch.SearchRoot = de; // Set your other search params here