8
votes

Un moyen plus rapide de savoir si un utilisateur existe sur un système?

J'ai une application qui vérifie si un utilisateur existe (si ce n'est pas la créer) chaque fois qu'il commence. Ceci est fait comme suit:

bool bUserExists = false;
DirectoryEntry dirEntryLocalMachine = 
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");

DirectoryEntries dirEntries = dirEntryLocalMachine.Children;

foreach (DirectoryEntry dirEntryUser in dirEntries)
{
    bUserExists = dirEntryUser.Name.Equals("UserName", 
        StringComparison.CurrentCultureIgnoreCase);

    if (bUserExists)
      break;
}


3 commentaires

Vous recherchez un utilisateur local sur la machine?


Votre utilisateur doit-il exister avant que l'application termine le démarrage?


Oui, l'application vérifiera si elle existe et la crée sinon ... cela fonctionne bien - seul problème est que la vérification prend beaucoup de temps.


4 Réponses :


25
votes

.NET 3.5 prend en charge la nouvelle ad classes de requête sous le system.directoryservices.accountmanagement espace de noms.

Pour en utiliser, vous devez ajouter" système. DirectoryServices.accountManagement "comme référence et ajoutez le à l'aide de instruction xxx

Pour les versions de .NET avant 3.5, voici un exemple propre que j'ai trouvé sur snippets dotnet xxx


3 commentaires

Malheureusement, je ne peux pas utiliser .NET 3.5, je suis coincé avec .NET 2.0 ... Y a-t-il un équivalent?


J'ai mis à jour ma réponse pour inclure un excellent article sur exactement ce que vous recherchez. Il est très similaire à votre méthode actuelle, mais au lieu d'énumérer à travers chaque objet, il utilise la fonction enfants.find (). Veuillez cliquer sur le lien car l'article a une classe complète pour gérer cela et c'est très agréable.


:( - C'est dommage et je ne sais pas d'autres solutions qui n'étaient pas mentionnées. Bien sûr, vous pouvez réévaluer si cette logique doit être appelée à chaque fois ou si elle doit être appelée au démarrage. Peut-être que Mettez-le dans un fil pour laisser l'utilisateur commencer à fonctionner? Sinon, les perceptions jouent un rôle important, montrant une barre de progression avec une accélération exponentielle (c.-à-d .: lenteur pendant 2 secondes, vitesse moyenne pendant 2 secondes, puis super vite pour les deux derniers) Créez la perception de la chargement rapide. Si tout échoue, essayez ceci: Stackoverflow.com/Questtions/182112/...



0
votes

Les éléments suivants dans une invite de commande renvoie 1 si "nom d'utilisateur" existe.

utilisateur net | Trouver "Nom d'utilisateur" / C


4 commentaires

Qu'est-ce que cela a à voir avec la découverte si un utilisateur existe en C #?


Cela pourrait être utilisé par C #, mais j'ai peur que ce n'est pas la solution la plus nette.


Je ne veux pas commencer à accumuler des coquilles de commandes à utiliser l'utilisateur net, quelque chose avec C # serait mieux.


@Henri: OK, vous pouvez l'utiliser. Comment obtenez-vous les résultats dans votre application C # pour savoir si l'utilisateur existe? Postez le code, s'il vous plaît.



6
votes

Vous voulez utiliser le DirectorySearcher.

quelque chose comme ceci: xxx

qui devrait être plus rapide. En outre, vous pouvez réduire les propriétés si tout ce que vous faites est de vérifier l'existence.


5 commentaires

Ceci est une méthode rapide et fonctionne avec des versions .NET avant 3,5 (si c'est votre environnement).


Je ne suis pas connu avec DirectoryENTry (Active Directory and Stuff), quelles propriétés ne sont pas nécessaires pour être à 100%, l'utilisateur n'existe pas déjà si je n'ai que le nom d'utilisateur à passer par?


En fait, n'incluez aucun et cela devrait aller. Je faisais juste un exemple générique au cas où vous souhaitiez des informations sur eux aussi. Donc, le filtre est ce que vous voulez, puis la rechercheResult.


Beached: Il y a quelques problèmes avec ce sniplift de code, par exemple String Str DomainName utilise DS mais DS est créé ultérieurement et utilise De qui utilise STR DomainName (problème cyclique) ...


J'avais mal à propos de DirectorySearcher. Cela ne fonctionne qu'avec l'annonce. J'ai mis à jour la solution pour utiliser la méthode de recherche sur l'objet DirectoryEry.



0
votes

Une autre solution est la suivante (prend en charge l'utilisateur local ou du domaine): xxx

l'utilisateur peut être non qualifié ou qualifié par nom machine / nom de domaine ( Domaine \ Nom d'utilisateur ). Si vous devez détecter spécifiquement si le compte existe sur la machine locale, qualifiez-la par environnement.machinename ( $ "{$" {environnement.machinename} ")"


0 commentaires