2010-07-20 5 views
1

J'essaie d'obtenir la liste des utilisateurs locaux d'un ordinateur en utilisant le code suivant.Obtenir les utilisateurs d'un ordinateur

 internal void GetUsers() 
     { 
     try 
     { 
      List<string> adUsers = new List<string>(); 
      DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName); 

      foreach (DirectoryEntry child in directoryEntry.Children) 
      { 
       if (child.SchemaClassName.Equals("User", StringComparison.OrdinalIgnoreCase)) 
       { 
        adUsers.Add(child.Name); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      //Exception 
     } 
    } 

Ce code fonctionne très bien sur mon ordinateur. Cependant, quand je l'ai testé sur quelques autres ordinateurs, les utilisateurs du système suivants ont été inclus dans la liste:

ASPNET, HelpAssistant

pourrait quelqu'un jeter un peu de lumière sur la façon dont je peux me débarrasser de ces utilisateurs du système et obtenir seulement les utilisateurs qui se connectent réellement, c'est-à-dire, les utilisateurs normaux.

Merci, Ram

Répondre

2

Pas une réponse en tant que telle, mais quelques suggestions qui pourraient vous aider.

Je pense que le problème est que ces comptes ne sont pas de vrais comptes système, donc peut-être pas si facile à distinguer.

Vous pouvez regarder les classes WMI Win32_UserAccount et Win32_UserProfile et voir s'il y a des propriétés là-dedans qui pourraient indiquer quels comptes d'utilisateurs sont normaux et lesquels sont ceux que vous mentionnez. Plus précisément, peut-être les propriétés 'SIDType' ou 'AccountType' de Win32_UserAccount ou peut-être la propriété Special de la classe Win32_UserProfile.

Peut-être que d'autres classes WMI méritent également d'être consultées.

Ou il peut y avoir une certaine manière que vous pouvez interroger si un compte d'utilisateur a le droit d'ouverture de session interactive (que je suppose que ces deux comptes ne peuvent pas avoir normalement).

+0

Salut HO1, merci beaucoup pour votre réponse ... Je vais essayer ... – Ram

1

Avez-vous essayé d'énumérer la collection de propriétés sur DirectoryEntry?

using (DirectoryEntry dirEntry = new DirectoryEntry(strchild)) 
    { 
     foreach (string strPropertyName in dirEntry.Properties.PropertyNames) 
     { 
      Console.WriteLine(strPropertyName + " " + dirEntry.Properties[strPropertyName].Value.ToString()); 
     } 
    } 

Autre que cela, vous pouvez avoir à faire une recherche LDAP sur Active Directory pour correspondre à la UserName que vous avez trouvé à un utilisateur ActiveDirectory.
Jetez un oeil à cet article. http://www.codeproject.com/KB/system/everythingInAD.aspx

Amusez-vous.

+0

Salut blorkfish, Je me doutais bien que les propriétés contribueraient. Mais je n'ai pas essayé ... Je vais essayer de revenir. Merci pour votre réponse. – Ram

0

Le code suivant vous obtiendra les utilisateurs locaux qui ont des dossiers accessibles localement. Si un meilleur développeur C# peut refactoriser le code pour le rendre plus propre, merci de nous aider!

var localDrives = Environment.GetLogicalDrives(); 
var localUsers = new List<string>(); 
var query = new SelectQuery("Win32_UserAccount") { Condition = "SIDType = 1 AND AccountType = 512" }; 
var searcher = new ManagementObjectSearcher(query); 

foreach (ManagementObject envVar in searcher.Get()) 
{ 
    foreach (string drive in localDrives) 
    { 
     var dir = Path.Combine(String.Format("{0}Users", drive), envVar["name"].ToString()); 
     if (Directory.Exists(dir)) 
     { 
      localUsers.Add(envVar["name"].ToString()); 
     } 
    } 
} 
Questions connexes