2012-09-07 24 views
5

¿Cómo puedo verificar desde C# si hay una cuenta de usuario local (es decir, la cuenta de administrador local) activa?Cómo verificar C# si la cuenta de usuario está activa

Lo que realmente quiero es un reemplazo de C# para el resultado "Account Active" = "Yes" (o "No") del comando "net user Administrator".

Me temo que esta pregunta parece un duplicado en this, pero no sé qué pasar para el parámetro para el objeto raíz DirectoryEntry. Probé cosas diferentes como "ldap: //" + Environment.MachineName, "ldap: //127.0.0.1", "WinNT: //" + Environment.MachineName, pero ninguno funcionó. El buscador me arroja una excepción. Llamada Find All() en los tres casos.

+0

lo excepción quieres llegar? – BlackICE

+0

Con "ldap: //" + Environment.MachineName obtengo una COMException con el mensaje "El servidor no está operativo". y ErrorCode = -2147016646. Lo mismo con "ldap: //127.0.0.1". – candritzky

+0

Con "WinNT: //" + Environment.MachineName Obtengo una excepción NotSupportedException con el mensaje "El proveedor no admite la búsqueda y no puede buscar WinNT: // ." – candritzky

Respuesta

5
class Program 
{ 
    static void Main(string[] args) 
    { 

     // Create the context for the principal object. 
     PrincipalContext ctx = new PrincipalContext(ContextType.Machine); 

     UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "Administrator"); 
     Console.WriteLine(String.Format("Administrator is enable: {0}", u.Enabled)); 

    } 
} 
+0

Gracias, esto también funciona. Pero la llamada a FindByIdentity a veces toma varios segundos antes de devolver un resultado. Aunque es un buen código, no es la mejor solución desde una perspectiva de rendimiento. – candritzky

+0

También noté eso, pero creo que hay algo de sobrecarga abriendo la conexión o algo así, porque cuando hacía las consultas posteriores eran muy rápidos. – BlackICE

1

Se pueden realizar consultas de Win32_UserAccount

Esto es lo repetitivo código WMI creador de MS escupe como referencia WMI;

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Disabled FROM Win32_UserAccount WHERE name = 'alexk'"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_UserAccount instance"); 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Disabled: {0}", queryObj["Disabled"]); 
        Console.ReadKey(); 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 

(me ligo la herramienta, pero como es habitual en los enlaces están muertos MSDN)

+0

¡Eso lo hizo! Tuve que agregar "domain = '" + Environment.MachineName + "'" a la consulta de WMI para restringir los resultados a las cuentas de usuario local, pero luego funcionó. ¡Muchas gracias! – candritzky

0

This no es exactamente lo mismo pero utilizan DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); Ojalá ayuda?

+0

No, no funciona. Devuelve un conjunto de resultados vacío. – candritzky

1

Pruebe esto.

var server = "YOURMACHINENAME"; 
var username = "Guest"; 
var de = new DirectoryEntry {Path = "WinNT://" + server + ",computer"}; 
var result = de.Children 
    .Cast<DirectoryEntry>() 
    .First<DirectoryEntry>(d => d.SchemaClassName == "User" && d.Properties["Name"].Value.ToString() == username); 

var flags = (int)result.Properties["UserFlags"].Value; 
var disabled = (flags & 2) == 2; 
+0

Funciona a la perfección. ¡Gracias! – candritzky

0

Teniendo en cuenta que es un usuario local, es necesario llamar a la API de Win32 funcion NetGetUserInfo a obtener lo que necesita.

El ejemplo de pinvoke.net es casi lo que necesita, sin embargo es necesario cambiar el parámetro de nivel a 2 para obtener el neccesary info

+0

Gracias. Esto también podría funcionar. No lo he intentado todavía Supongo que te estás refiriendo al campo USER_INFO_2.usri2_flags (UF_ACCOUNTDISABLE). Aunque es mejor que evite P/Invoke y me quede con una solución C# WMI o LDAP pura. – candritzky

Cuestiones relacionadas