2013-05-03 1 views
1

Je suis certes très nouveau à AD. J'ai une liste déroulante que j'ai liée à une liste de membres au sein de notre organisation. Mon but final est de trouver le nom de leur manager, mais je commence avec des petits pas.Récupérer le nom de l'utilisateur à partir de Active Directory

J'ai fait assez de recherche pour obtenir le bon résultat. Je vais avoir un problème à obtenir les bonnes données (vérifié à l'aide des points d'arrêt, etc.) sur le résultat

private void cmbUserList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var userName = cmbUserList.SelectedValue.ToString(); 
    DirectorySearcher search = new DirectorySearcher(); 

    search.Filter = String.Format("(cn={0})", userName); 
    search.PropertiesToLoad.Add("givenName"); 

    SearchResult result = search.FindOne(); 

    if (result != null) 
    { 
     // For now I'm trying to just retrieve their name 
     lblManagerName.Text = result.GetDirectoryEntry().Name; 
    } 
} 

EDIT: J'utilise la version .net 4.0

Quelqu'un pourrait-il me diriger vers la récupération de la bonne nom, et peut-être même un lien ou des ressources pour tirer le nom du gestionnaire?

+0

Quelle version de .NET utilisez-vous? –

+0

Désolé bonne question en utilisant 4.0 –

+0

Avez-vous obtenu quelque chose comme: result.Properties ("givenName") (0) .ToString()? –

Répondre

2

Je pense que le problème avec votre code est que vous utilisez "(cn = {0})", nomUtilisateur. Vous devez passer le nom complet comme

CN=Doe,John,OU=Users,OU=Headquarters,DC=company,DC=net 

Si vous avez seulement ID de connexion, le code ci-dessous devrait fonctionner

DirectorySearcher directorySearcher = new DirectorySearcher("LDAP://RootDSE"); 
directorySearcher.Filter = "sAMAccountName=" + acctName; 
directorySearcher.PropertiesToLoad.Add("manager"); 
SearchResult searchResult = directorySearcher.FindOne(); 
if (searchResult != null) 
DirectoryEntry user = searchResult.GetDirectoryEntry(); 

Notez que acctName est l'ID de connexion de Windows. Si vous voulez jouer avec AD et vérifier les propriétés vearious et comment ils sont stockés, essayez les outils de ligne de commande dsquery et dsget. La commande ci-dessous retourne un enregistrement utilisateur en fonction de l'ID de connexion et affiche le contenu du champ manager:

dsquery user domainroot -samid "loginid" | dsget user -samid -mgr 
+0

ce n'est pas vrai, l'attribut cn dans AD est juste le nom complet, donc pour John Smith => cn = John Smith. Je supporte pleinement la recherche par sAMAccountName – Zilog

+0

@ Zilog Je crois qu'il est configurable dans AD, j'ai vu "dernier, premier" aussi. – Sergey

+0

Le chemin complet auquel vous faites référence dans dn (Distinguished Name) n'est pas cn, donc la requête (cn = {0}) était/est correcte tant que {0} est le nom complet, et il ne peut pas être le chemin complet comme vous suggérez. Votre suggestion d'utiliser sAMAccountName est valide. – Zilog

0

classe d'aide et ENUM

public enum ActiveDirectoryObjectClass 
{ 
    Computer, 
    User, 
    Domain, 
    Group, 
} 

public static class ActiveDirectorySearcher 
{ 
    public static string GetCurrentDomainName() 
    { 
     string result; 
     using (Domain domain = Domain.GetCurrentDomain()) 
     { 
      result = domain.Name; 
     } 

     return result; 
    } 

    public static IEnumerable<T> Select<T>(
     ActiveDirectoryObjectClass activeDirectoryObjectClass, 
     Func<DirectoryEntry, ActiveDirectoryObjectClass, bool> condition, 
     Func<DirectoryEntry, T> selector 
     ) 
    { 
     List<T> list = new List<T>(); 
     using (Domain domain = Domain.GetCurrentDomain()) 
     using (DirectoryEntry root = domain.GetDirectoryEntry()) 
     { 
      string filter = string.Format("(objectClass={0})", activeDirectoryObjectClass); 
      using (DirectorySearcher searcher = new DirectorySearcher(filter)) 
      { 
       searcher.SearchRoot = root; 
       searcher.SearchScope = SearchScope.Subtree; 
       using (SearchResultCollection result = searcher.FindAll()) 
       { 
        foreach (SearchResult item in result) 
        { 
         using (DirectoryEntry entry = item.GetDirectoryEntry()) 
         { 
          if (condition(entry, activeDirectoryObjectClass)) 
          { 
           list.Add(selector(entry)); 
          } 
         } 
        } 
       } 
      } 

     } 
     return list; 
    } 
} 

comment utiliser

public IEnumerable<User> GetUsers() 
    { 
     return ActiveDirectorySearcher.Select(
      ActiveDirectoryObjectClass.User, 
      (entry, adObjectClass) => string.Compare(entry.SchemaClassName, adObjectClass.ToString(), StringComparison.InvariantCultureIgnoreCase) == 0, 
      _ => new User 
        { 
         Name = _.Name.Substring(3), 
         Domain = ActiveDirectorySearcher.GetCurrentDomainName(), 
        }); 
    } 

Remarque : Utilisateur dans l'échantillon - classe personnalisée avec les propriétés Nom, Domaine, etc.

0

pour trouver le nom et/ou l'homme Nom Ager:

if (sResult != null) 
{ 
    string userName = sResult.Properties["name"][0].ToString(); 
    string managerDN = sResult.Properties["manager"][0].ToString(); 

    DirectoryEntry man = new DirectoryEntry("LDAP://server_name/"+managerDN); 
    string managerName = man.Properties["name"][0].ToString(); 

} 

nom_serveur peut être juste composante de domaine FQDN i.e. yourcompany.com, de cette façon il trouvera serveur de catalogue sur son propre via DNS.

Edit:

I Active Directory aussi Recomend Explorer à partir de Sysinternals. C'est un excellent outil pour explorer et comprendre la structure de l'AD

Questions connexes