2010-01-11 5 views
12

J'ai deux questions.C#: comment savoir si un 'compte utilisateur' existe dans Windows?

1) Comment savoir si un «compte utilisateur» existe sur mon système d'exploitation Windows (vista)? J'ai besoin de cette information d'une machine autonome. Je veux dire, la machine ne rejoint aucun domaine.

2) aussi je veux savoir si un utilisateur fait partie d'un groupe? par exemple. est un utilisateur 'admin' partie du groupe administrateur ou non?

quelqu'un pourrait-il aider pls ..

Répondre

2

J'ai essayé le code suivant et fonctionne très bien pour moi ..

public bool IsUserMemberOfGroup(string userName, string groupName) 
    { 
     bool ret = false; 

     try 
     { 
      DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName); 
      DirectoryEntry userGroup = localMachine.Children.Find(groupName, "group"); 

      object members = userGroup.Invoke("members", null); 
      foreach (object groupMember in (IEnumerable)members) 
      { 
       DirectoryEntry member = new DirectoryEntry(groupMember); 
       if (member.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase)) 
       { 
        ret = true; 
        break; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ret = false; 
     } 
     return ret; 
    } 
0

Vous pouvez consulter cette forum post. Il vous donnera la liste énumérée via WMI des utilisateurs sur la machine. Vous pouvez ensuite vérifier pour voir si votre compte est là. Le forum renvoie également à un article sur le code project. Je crois que vous pouvez obtenir l'adhésion à un groupe via WMI, mais je peux me tromper.

10

Vous pouvez vérifier si un compte local existe via l'espace de noms System.Security.Principal à l'aide du code suivant.

bool AccountExists(string name) 
{ 
    bool bRet = false; 

    try 
    { 
     NTAccount acct = new NTAccount(name); 
     SecurityIdentifier id = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier)); 

     bRet = id.IsAccountSid(); 
    } 
    catch (IdentityNotMappedException) 
    { 
     /* Invalid user account */ 
    } 

    return bRet; 
} 

Maintenant, pour appartenance à un groupe est un peu plus difficile, vous pouvez facilement le faire pour l'utilisateur actuel en utilisant la méthode WindowsPrinciple.IsInRole (création d'un principe de la méthode WindowsIdentify.GetCurrent()).

Comme souligné, je ne pense pas qu'il existe un moyen d'obtenir autre chose sans avoir recours à pinvoke ou WMI. Donc, voici un peu de code pour vérifier l'appartenance à un groupe avec WMI.

bool IsUserInGroup(string name, string group) 
{ 
    bool bRet = false; 
    ObjectQuery query = new ObjectQuery(String.Format("SELECT * FROM Win32_UserAccount WHERE Name='{0}' AND LocalAccount=True", name)); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    ManagementObjectCollection objs = searcher.Get(); 

    foreach (ManagementObject o in objs) 
    { 
     ManagementObjectCollection coll = o.GetRelated("Win32_Group"); 
     foreach (ManagementObject g in coll) 
     { 
      bool local = (bool)g["LocalAccount"]; 
      string groupName = (string)g["Name"]; 

      if (local && groupName.Equals(group, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       bRet = true; 
       break; 
      } 
     } 
    }   

    return bRet; 
} 
+0

Merci beaucoup Tyranides. Ça marche, mais un peu lent. de toute façon, merci encore !! – satya

+0

Si vous modifiez NTAccount à ce NTAccount acct = new NTAccount (Environment.MachineName, name); C'est beaucoup plus rapide. YMMV. – Tollo

Questions connexes