2012-10-05 31 views
8

¿Cómo puedo obtener una lista de usuarios de Windows local (sólo los usuarios que aparecen en la pantalla de Windows inicio de sesión)¿Cómo puedo obtener una lista de usuarios de Windows local (sólo los usuarios que aparecen en la pantalla de Windows inicio de sesión)

He intentado muchos métodos usando Windows Principio biblioteca & WMI Seleccionar comandos. Sigo recibiendo Administrador, Invitado & algunas otras cuentas extrañas (VUSRNEIL-DELL, $ HOMEGROUPUSER, ASPNET ... etc.)

Ninguna de estas 3 cuentas de usuario aparece en la pantalla de inicio de sesión. ¿Cómo puedo diferenciar entre estos tipos de usuario?

estoy de codificación en C#

Respuesta

3

Si utiliza WMI para consultar Win32_UserAccount puede mostrar sólo los elementos que cumplan las condiciones siguientes:

  • Propiedad AccountType tiene la bandera UF_NORMAL_ACCOUNT.
  • La propiedad Disabled es false.
  • La propiedad es false.
  • La propiedad LocalAccount es true.
  • La propiedad SIDType es SidTypeUser.

Si no puede utilizar WMI (o no querer usarlo), entonces usted tiene que hacer un poco más de trabajo, que básicamente tienen que utilizar NetGroupGetUsers función para enumerar todos los usuarios. Vea this article on CodeProject para un ejemplo.

10

Sólo añadir una referencia a System.Management en una aplicación de consola y prueba este código:

using System; 
using System.Management; 
using System.Linq; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount"); 
      ManagementObjectCollection users = usersSearcher.Get(); 

      var localUsers = users.Cast<ManagementObject>().Where(
       u => (bool)u["LocalAccount"] == true && 
        (bool)u["Disabled"] == false && 
        (bool)u["Lockout"] == false && 
        int.Parse(u["SIDType"].ToString()) == 1 && 
        u["Name"].ToString() != "HomeGroupUser$"); 

      foreach (ManagementObject user in localUsers) 
      { 
       Console.WriteLine("Account Type: " + user["AccountType"].ToString()); 
       Console.WriteLine("Caption: " + user["Caption"].ToString()); 
       Console.WriteLine("Description: " + user["Description"].ToString()); 
       Console.WriteLine("Disabled: " + user["Disabled"].ToString()); 
       Console.WriteLine("Domain: " + user["Domain"].ToString()); 
       Console.WriteLine("Full Name: " + user["FullName"].ToString()); 
       Console.WriteLine("Local Account: " + user["LocalAccount"].ToString()); 
       Console.WriteLine("Lockout: " + user["Lockout"].ToString()); 
       Console.WriteLine("Name: " + user["Name"].ToString()); 
       Console.WriteLine("Password Changeable: " + user["PasswordChangeable"].ToString()); 
       Console.WriteLine("Password Expires: " + user["PasswordExpires"].ToString()); 
       Console.WriteLine("Password Required: " + user["PasswordRequired"].ToString()); 
       Console.WriteLine("SID: " + user["SID"].ToString()); 
       Console.WriteLine("SID Type: " + user["SIDType"].ToString()); 
       Console.WriteLine("Status: " + user["Status"].ToString()); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
+1

Esto funciona bien, pero puede ser lento. Cuando lo ejecuto en un miembro de dominio de Windows 7, toda mi aplicación se ejecuta en 5 segundos. Cuando lo ejecuto en un servidor de Windows 2008, toda mi aplicación tarda casi 3 minutos. La mayor parte de la diferencia son las pausas al iterar a través de los usuarios encontrados. –

+1

localusers es en su ejemplo una variable no utilizada, ¿qué hay en la demostración? – Offler

-2

Esto le dará una lista de todas las cuentas de usuario, su dominio, el nombre completo y el SID.

wmic useraccount get domain,name,sid 
Cuestiones relacionadas