2010-01-11 20 views
12

Tengo dos preguntas.C#: ¿cómo saber si existe una 'cuenta de usuario' en Windows?

1) ¿Cómo sé si existe una 'cuenta de usuario' en mi sistema operativo Windows (vista)? Necesito esta información de una máquina independiente. Quiero decir, la máquina no se une a ningún dominio.

2) también quiero saber si un usuario es parte de un grupo? por ej. ¿Es un usuario 'administrador' del grupo de administradores o no?

podría alguien pls ayuda ..

Respuesta

2

He probado el siguiente código y está trabajando muy bien para mí ..

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

Es posible que desee comprobar fuera de este forum post. Le dará la lista enumerada a través de WMI de los usuarios en la máquina. Luego puede verificar si su cuenta está allí. El foro también tiene enlaces a un artículo en code project. Creo que también puedes obtener membresía grupal a través de WMI, pero podría estar equivocado.

10

Puede resolver si existe una cuenta local a través del espacio de nombres System.Security.Principal con el siguiente código.

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; 
} 

Ahora conseguir pertenencia a un grupo es un poco más difícil, se puede hacer fácilmente para el usuario actual utilizando el método WindowsPrinciple.IsInRole (la creación de un principio del método WindowsIdentify.GetCurrent()).

Como se señaló, no creo que haya una manera de obtener nada más sin recurrir a pinvoke o WMI. Así que aquí hay un poco de código para verificar la membresía del grupo con 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

gracias tiránida mucho. Está funcionando, pero un poco lento. de todos modos, ¡gracias de nuevo! – satya

+0

Si cambia NTAccount a este NTAccount acct = new NTAccount (Environment.MachineName, name); es MUCHO más rápido. YMMV. – Tollo

Cuestiones relacionadas