2009-09-04 4 views
1

J'ai le code suivant qui se charge de SID de l'utilisateur objet Active Directory DirectoryEntry d'un utilisateur:Quel est le moyen le plus efficace pour charger DirectoryEntry d'un utilisateur?

public static DirectoryEntry GetUserDirectoryEntry(SecurityIdentifier sid) 
{ 
    return new DirectoryEntry(string.Format("LDAP://<SID={0}>", sid.Value)); 
} 

est-il un moyen plus efficace de le faire? Je dois optimiser mon code en raison de problèmes de performances, et j'ai besoin de réduire au maximum le code le plus rapide possible. Il ne doit pas nécessairement charger à partir d'un SID. J'ai juste besoin de connaître le moyen le plus efficace pour obtenir les utilisateurs DirectoryEntry.

EDIT: Je suis limité à l'utilisation de .Net 2.0.

Répondre

1

Je ne pense pas que cela fasse une grande différence que vous chargez votre DirectoryEntry - que ce soit par SID ou par DN entièrement qualifié - il faut juste une certaine quantité de temps pour l'opération de liaison AD travailler

Ce bind ne se produit pas réellement lorsque vous instanciez votre DirectoryEntry - il est retardé jusqu'à ce que vous commenciez à utiliser des propriétés sur votre DirectoryEntry ou à accéder à la propriété .NativeObject.

Ainsi, peu importe la façon dont vous le faites - créer votre DirectoryEntry basé sur une valeur d'identification unique prendra juste son temps.

Marc

1

Vous devriez essayer de définir plus de filtres et spécifier l'utilisateur comme type dans vos critères.

+0

Je ne suis pas faire une recherche. Êtes-vous en train de dire qu'il serait plus efficace d'utiliser une classe de recherche d'annuaire? –

+0

Par recherche, je voulais dire que vous utilisez une requête LDAP (recherche dans l'AD). Chaque requête LDAP que vous exécutez compte comme une recherche. –

2

Les opérations d'annuaire sont assez lentes, quel que soit le moyen que vous utilisez pour accéder aux objets dans le répertoire. Sans plus de contexte, il est difficile de recommander une approche plus efficace, mais en général, avez-vous envisagé de saisir des ensembles d'utilisateurs à la fois, multithread, et la mise en cache pour concevoir autour du problème?

Aussi, je ne peux pas dire lequel est le plus efficace, mais avez-vous essayé le nouvel espace de noms System.DirectoryServices.AccountManagement dans .NET 3.5? Si quelqu'un devrait avoir optimisé cela, ce serait Microsoft, mais je pense que nous avons tous été laissé tomber avant.

+0

J'ai modifié la question pour ajouter que je suis limité à l'utilisation de .Net 2.0. En outre, j'ai seulement besoin de tirer un utilisateur à la fois. –

1

Qu'en est l'espace de noms System.DirectoryServices.Protocols. Il n'a pas le temps d'utiliser ADSI et devrait être beaucoup plus rapide. Ça a l'air un peu lourd au début mais une fois qu'on s'y habitue, ce n'est pas si mal. De plus, vous pouvez effectuer des recherches asynchrones appropriées.

Jetez un oeil à:

Questions connexes