2010-10-01 10 views
2

J'utilise cette méthode simple pour trouver un utilisateur dans le domaine actuel, qui fonctionne pour tous les utilisateurs qui existent, mais je ne trouve aucun moyen de déterminer si l'utilisateur n'existe pas.Comment déterminer si "DirectoryEntry" a trouvé mon utilisateur?

string userLDAP = @"MYDOMAIN/username"; 
string path = "WinNT://" + userLDAP ; 
DirectoryEntry root = new DirectoryEntry(path, null, null, AuthenticationTypes.Secure); 

À part de laisser une exception être levée, comment puis-je utiliser une entrée de répertoire pour déterminer si un utilisateur n'existe pas?

if (root.Properties != null) 
     if (root.Properties["objectSid"] != null) //// EXCEPTION HERE 
      if (root.Properties["objectSid"][0] != null) 

Répondre

5

Il est préférable d'utiliser DirectorySearcher à cette fin ...

string userName = "TargetUserName"; 

     using (DirectorySearcher searcher = new DirectorySearcher("GC://yourdomain.com")) 
     { 
      searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", userName); 

      using (SearchResultCollection results = searcher.FindAll()) 
      { 
       if (results.Count > 0) 
        Debug.WriteLine("Found User"); 

      } 
     } 

Cet échantillon recherche et de la forêt entière, y compris les domaines enfants. Si vous ne souhaitez cibler qu'un seul domaine, utilisez "LDAP: //mydomain.com" au lieu de "GC: //mondomaine.com". Vous pouvez également fournir searcher.SearchRoot avec un DirectoryEntry à utiliser comme racine d'une recherche (c'est-à-dire une unité d'organisation ou un domaine spécifique). N'oubliez pas que la plupart des documents AD sont IDisposables, alors jetez-les correctement comme indiqué ci-dessus.

+0

+1 puisque cela semble être la réponse la plus complète. – LamonteCristo

+0

... (et merci pour l'édition pour le rendre encore plus complet) – LamonteCristo

0

Vous cherchez un utilisateur spécifique ou tous les utilisateurs?

J'ai une application qui vérifie si un utilisateur est présent en vérifiant le nom du compte - il utilise SecurityIdentifier dans l'espace de noms System.Security.Principal pour vérifier si le Sid est valide.

public bool AccountExists(string name) 
     { 
      bool SidExists = false; 
      try 
      { 
       NTAccount Acct = new NTAccount(name); 
       SecurityIdentifier id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier)); 
       SidExists = id.IsAccountSid(); 
      } 
      catch (IdentityNotMappedException) 
      { 
       //Oh snap. 
      } 
      return SidExists; 
     } 

Vous pouvez spécifier le domaine lors de la création de votre NTAccount objet

NTAccount Acct = new NTAccount("SampleDomain", "SampleName"); 

EDIT

En ce qui concerne votre commentaire, serait-ce pour vous? Na pas vérifier, pourrait avoir à gérer un retour nul possible avant evaulating la méthode IsAccountSid() ...

public SecurityIdentifier AccountSID(string myDomain, string myAcct) 
{ 
    SecurityIdentifier id; 

    try 
    { 
    NTAccount Acct = new NTAccount(myDomain, myAcct); 
    id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier)); 
    } 
    catch (IdentityNotMappedException) 
    { 
    //Oh snap. 
    } 

    return id; 
} 

SecurityIdentifier AcctSID = AccountSID("ExampleDomain", "ExampleName"); 

if (AcctSID.IsAccountSid()) 
    //Do Something 
+0

Je suis à la recherche d'un utilisateur spécifique. Mon but est d'obtenir un SID dans le but de l'ajouter à un rôle SSAS – LamonteCristo

0

Je pense un moyen facile de vérifier si votre DirectoryEntry points d'objet à une entrée AD existante utilise le statique Existant méthode.

Ainsi, votre code peut ressembler à ceci:

using(DirectoryEntry de = new DirectoryEntry(....)) { 
    // now we check if the related object exists 
    bool exists = DirectoryEntry.Exists(de.Path); 
    if(exists) { 
    // yes the objects exists 
    // do something 

    } // end if 
} // end using 

Bien sûr, vous pouvez omettre la existe variable. Je l'ai utilisé juste pour rendre la déclaration plus claire.