Question

J'ai un code qui interroge Active Directory pour vérifier l'existence de l'utilisateur. Je suis en train de vérifier une longue liste d'environ 1300 ids. J'ai essayé plusieurs méthodes pour vérifier si un compte utilisateur (LINQ to AD, DirectorySearcher (avec et sans parent DirectoryEntry) et aussi un DirectoryEntry qui relie la WinNT: // chemin). Chaque fois qu'il reviendra et dire que plusieurs utilisateurs n'existent pas. Si je hardcode leurs userids dans le code et Execute pour individuellement, il valide l'existence. Si je tente et de le faire dans une boucle foreach, je reçois plusieurs faux négatifs.

Voici le code que je utilise en ce moment ..

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"};

List<string> nonExistingUsers = new List<string>();
List<string> ExistingUsers = new List<string>();
foreach (string s in userIDs)
{
 DirectorySearcher search = new DirectorySearcher();
 search.Filter = String.Format("(SAMAccountName={0})", s);
 search.PropertiesToLoad.Add("cn");
 DirectorySearcher ds = new DirectorySearcher(de, "(&(objectClass=user)(cn=" + s + "))", new string[] { "Name" }, SearchScope.Subtree);
 SearchResultCollection resultCollection = ds.FindAll();
 SearchResult result = search.FindOne();
 if (result != null)
  ExistingUsers.Add(s);
 else
  nonExistingUsers.Add(s);
}

Toutes les suggestions ou raisons pour lesquelles je reçois les faux négatifs?

Était-ce utile?

La solution

Couple de choses:

  • Tout d'abord, essayez d'utiliser la « anr = » (résolution de nom ambigu) dans votre filtre LDAP - il recherche plusieurs attributs liés nom et faciliter la recherche. Le UserID pourrait ne pas faire partie de la réelle "nom commun" (CN = user1)

  • d'autre part, utiliser le objectCategory au lieu de objectClass - le objectCategory est à valeur unique et indexé et donc un peu juste plus rapide sur les recherches

  • Troisièmement: pourquoi vous appelez d'abord sur la ligne suivante .FindAll () puis .FindOne ()? Ne semble pas vraiment nécessaire du tout ....

  • WinNT: // est vraiment uniquement pour la compatibilité ascendante et si vous avez besoin pour traiter les comptes d'ordinateurs locaux - essayer d'éviter autant que possible, il expose aussi beaucoup moins de propriétés que LDAP

Voici mon code j'écrire:

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"};

DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=Users,dc=YourComp,dc=com");

List<string> nonExistingUsers = new List<string>();
List<string> ExistingUsers = new List<string>();

foreach (string s in userIDs)
{
   DirectorySearcher search = new DirectorySearcher(searchRoot);

   search.SearchScope = SearchScope.Subtree;
   search.Filter = string.Format("(&(objectCategory=person)(anr={0}))", s);

   SearchResultCollection resultCollection = ds.FindAll();

   if(resultCollection != null && resultCollection.Count > 0)
      ExistingUsers.Add(s);
   else
      nonExistingUsers.Add(s);
}

Est-ce que le travail dans votre scénario ??

En outre, si vous utilisez .NET 3.5 ou supérieur, les choses ont beaucoup plus facile - voir:

Gestion répertoire directeurs de sécurité dans le .NET Framework 3.5

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top