2009-11-04 13 views
7

Tengo una aplicación que comprueba si existe un usuario (si no lo crea) cada vez que se inicia. Esto se hace de la siguiente manera:¿Forma más rápida de averiguar si un usuario existe en un sistema?

bool bUserExists = false; 
DirectoryEntry dirEntryLocalMachine = 
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); 

DirectoryEntries dirEntries = dirEntryLocalMachine.Children; 

foreach (DirectoryEntry dirEntryUser in dirEntries) 
{ 
    bUserExists = dirEntryUser.Name.Equals("UserName", 
     StringComparison.CurrentCultureIgnoreCase); 

    if (bUserExists) 
     break; 
} 

El problema está en la mayoría de los sistemas donde se implementa. Esto puede tomar de 6 a 10 segundos, que es demasiado largo ... Necesito encontrar una manera de reducir esto (tanto como sea posible). ¿Hay un mejor o más rápido manera que puedo utilizar para verificar si un usuario existe en el sistema o no?

Sé que hay otras maneras de resolver esto, como tener las otras aplicaciones para dormir durante 10 segundos, o hacer que esta herramienta envíe un mensaje cuando esté lista, etc. ... Pero si puedo reducir en gran medida el tiempo que toma para encontrar al usuario, me haría la vida mucho más fácil.

+0

¿Está buscando un usuario local en la máquina? –

+0

Sí, solo usuario local – Shaitan00

+0

¿Necesita su usuario existir antes de que la aplicación finalice el inicio? –

Respuesta

20

.NET 3.5 admite las nuevas clases de consulta AD en el espacio de nombres System.DirectoryServices.AccountManagement.

Para utilizarlo, deberá agregar "System.DirectoryServices.AccountManagement" como referencia Y agregar la instrucción using.

using System.DirectoryServices.AccountManagement; 


using (PrincipalContext pc = new PrincipalContext(ContextType.Machine)) 
{ 
    UserPrincipal up = UserPrincipal.FindByIdentity(
     pc, 
     IdentityType.SamAccountName, 
     "UserName"); 

    bool UserExists = (up != null); 
} 

< .NET 3.5

Para versiones anteriores de .NET a 3.5, aquí es un ejemplo limpio que he encontrado en dotnet-snippets

DirectoryEntry dirEntryLocalMachine = 
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); 

bool UserExists = 
    dirEntryLocalMachine.Children.Find(userIdentity, "user") != null; 
+0

Tristemente no puedo usar .NET 3.5, estoy atorado con .NET 2.0 ... ¿Hay un equivalente? – Shaitan00

+0

Actualicé mi respuesta para incluir un excelente artículo sobre exactamente lo que está buscando. Es muy similar a su método actual, pero en lugar de enumerar a través de cada objeto, usa la función Children.Find(). Haga clic en el enlace ya que el artículo tiene una clase completa para manejar esto y es muy bueno. –

+0

Funciona, pero toma el mismo tiempo ... – Shaitan00

1

El siguiente en un comando vuelve a aparecer 1 si 'nombre de usuario' existe.

usuario neto | buscar "nombre de usuario"/c

+1

¿Qué tiene eso que ver con averiguar si un usuario existe en C#? –

+0

Podría ser utilizado por C#, pero me temo que esta no es la solución más ordenada. – Henri

+0

No quiero comenzar a generar shells de comando para usar net user, algo con C# sería mejor. – Shaitan00

5

Desea utilizar DirectorySearcher.

Algo como esto:

static bool userexists(string strUserName) { 
    string adsPath = string.Format(@"WinNT://{0}", System.Environment.MachineName); 
    using(DirectoryEntry de = new DirectoryEntry(adsPath)) { 
     try { 
      return de.Children.Find(strUserName) != null; 
     } catch(Exception e) { 
      return false; 
     } 
    } 
} 

Eso debería ser más rápido. Además, puede reducir las propiedades si todo lo que hace es verificar la existencia.

+0

Este es un método rápido Y funciona con versiones .NET anteriores a 3.5 (si ese es su entorno). –

+0

¿Dónde se establece el resultado? – Shaitan00

+0

No estoy tan familiarizado con DirectoryEntry (directorio activo y cosas así), ¿qué propiedades no son necesarias para estar 100% seguro de que el usuario no existe si solo tengo el UserName? – Shaitan00

0

Esto debe hacerlo (cuando no se puede utilizar System.DirectoryServices.AccountManagement):

static bool userExists(string sUser) 
{ 
    using (var oUser = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + sUser + ",user")) 
    { 
     return (oUser != null); 
    } 
} 
Cuestiones relacionadas