2009-04-03 22 views
5

Necesito encontrar una manera de verificar si una cuenta de usuario de Active Directory tiene su cuenta bloqueada o no.Obtener estado de cuenta de usuario (bloqueado/desbloqueado) de Active Directory en C-Sharp/C#

He intentado la propiedad userAccountControl en un Windows 2000 AD pero esa propiedad no cambia un byte cuando forzo a una cuenta a bloquearse (al intentar iniciar sesión en una estación de trabajo que proporciona la contraseña incorrecta para ese usuario específico) Puedo decir utilizando ADExplorer.exe utilidad hecha por semi-dios -> Sr. Russinovich

He visto que en el 3.5 Framework utilizan el método .InvokeGet ("userLockedOut"); pero estoy tratando de hacer esto en una Aplicación Empresarial que fue escrita en .NET Framework 1.1 y no hay posibilidad de usar las más nuevas (solo si pensaste en sugerirlo).

Respuesta

3

Aquí hay un enlace con toda la información en materia de Active Directory ...

http://www.codeproject.com/KB/system/everythingInAD.aspx

+0

Gracias por su respuesta .... este artículo se encuentra en el proyecto de código que se refiere a todas las publicaciones en la red no es para .NET Framework 1.1 es para 2.0 y arriba e ... http://www.codeproject.com/KB/system/everythingInAD.aspx#45 – monoco

2

Encontrado esto, es un poco más de lo que he hecho en el pasado (no puede encontrar fragmentos exactos) aunque la clave es hacer una búsqueda de directorio y limitar en función del tiempo de bloqueo para los usuarios que se devuelven. Además, para un usuario en particular, puede limitar aún más su búsqueda utilizando propiedades adicionales. El enlace del proyecto de código anterior tiene esa lógica particular (para limitar la búsqueda), creo.

class Lockout : IDisposable 
{ 
    DirectoryContext context; 
    DirectoryEntry root; 
    DomainPolicy policy; 

    public Lockout(string domainName) 
    { 
    this.context = new DirectoryContext(
     DirectoryContextType.Domain, 
     domainName 
    ); 

    //get our current domain policy 
    Domain domain = Domain.GetDomain(this.context); 

    this.root = domain.GetDirectoryEntry(); 
    this.policy = new DomainPolicy(this.root);  
    } 

    public void FindLockedAccounts() 
    { 
    //default for when accounts stay locked indefinitely 
    string qry = "(lockoutTime>=1)"; 

    TimeSpan duration = this.policy.LockoutDuration; 

    if (duration != TimeSpan.MaxValue) 
    { 
     DateTime lockoutThreshold = 
     DateTime.Now.Subtract(duration); 

     qry = String.Format(
     "(lockoutTime>={0})", 
     lockoutThreshold.ToFileTime() 
     ); 
    } 

    DirectorySearcher ds = new DirectorySearcher(
     this.root, 
     qry 
    ); 

    using (SearchResultCollection src = ds.FindAll()) 
    { 
     foreach (SearchResult sr in src) 
     { 
     long ticks = 
      (long)sr.Properties["lockoutTime"][0]; 

     Console.WriteLine(
      "{0} locked out at {1}", 
      sr.Properties["name"][0], 
      DateTime.FromFileTime(ticks) 
     ); 
     } 
    } 
    } 

    public void Dispose() 
    { 
    if (this.root != null) 
    { 
     this.root.Dispose(); 
    } 
    } 
} 

Código fue sacado de este post: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5e0fadc2-f27b-48f6-a6ac-644e12256c67/

+0

Gracias Joshua, pero desafortunadamente su solución que ya había visto navegando por la web implementa clases que son de .Net 2.0 y más arriba como: Propiedad HostSecurityManager.DomainPolicy Nota: Esta propiedad es nueva en .NET Framework versión 2.0. – monoco

+0

Ahh, lo siento, no vi el 1.1 en mi entusiasmo por responder la pregunta. – Joshua

0

Después de ver el .NET 1.1, consulte este hilo hacia afuera: http://forums.asp.net/t/434077.aspx, utilizando el lockoutTime en el filtro todavía debe hacer el truco.

Específicamente en el hilo (después de la entrada de código más grande que proporciona una gran cantidad de la sintaxis):

(&(objectClass=user)(objectCategory=person)(lockoutTime>=1)); 

Otra cosa, resulta que si está utilizando .NET v.1.1, a continuación, S. DS convierte la Integer8 al entero largo correcta para usted (no funciona con 1,0) - lo que significa que puede acabar con código de reflexión (en el puesto):

//use the filter from above 

SearchResultCollection src = ds.FindAll(); 

foreach(SearchResult sr in src) 

{ 

    DateTime lockoutTime = DateTime.FromFileTime((long)sr.Properties["lockoutTime][0]); 

    Response.Output.Write("Locked Out on: {0}", lockoutTime.ToString()); 

} 
Cuestiones relacionadas