2009-04-03 2 views
5

Je dois trouver un moyen de vérifier si un compte d'utilisateur Active Directory a son compte verrouillé ou non. J'ai essayé la propriété userAccountControl dans un AD Windows 2000 mais cette propriété ne modifie pas un octet lorsque je force un compte à se verrouiller (en essayant de me connecter à un poste de travail fournissant le mauvais mot de passe pour cet utilisateur spécifique). Je peux dire en utilisant ADExplorer.exe utilitaire fait par semi-dieu -> M. RussinovichObtenir le statut du compte d'utilisateur (verrouillé/déverrouillé) à partir d'Active Directory sur C-Sharp/C#

J'ai vu que dans le cadre 3.5 ils utilisent la méthode .InvokeGet ("userLockedOut"); mais j'essaye de faire ceci dans une application d'entreprise qui a été écrite dans le .Net Framework 1.1 et il n'y a aucune chance d'employer de plus nouveaux (juste si vous pensiez le suggérer ainsi).

Répondre

3

Voici un lien avec toutes les informations sur des choses Active Directory ...

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

+0

Merci pour votre réponse .... cet article trouvé à codeproject auquel tous les autres messages du Net ne se réfèrent pas .Net Framework 1.1 est pour 2.0 et plus e ... http://www.codeproject.com/KB/system/everythingInAD.aspx#45 – monoco

2

trouvé cela, il est un peu plus que je ne l'ai fait dans le passé (ne peut pas trouver des extraits précis) bien que la clé effectue une recherche et une limitation d'annuaire en fonction du temps de verrouillage de vos utilisateurs renvoyés. En outre, pour un utilisateur particulier, vous pouvez limiter votre recherche en utilisant d'autres propriétés. Le lien codeproject ci-dessus a cette logique particulière (pour limiter la recherche) je crois.

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

Code a été tiré de ce poste: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5e0fadc2-f27b-48f6-a6ac-644e12256c67/

+0

Merci Joshua, mais malheureusement votre solution que j'avais déjà vu surfer sur le web implémente des classes qui viennent de .Net 2.0 et au-dessus tels que: HostSecurityManager.DomainPolicy Propriété Remarque: Cette propriété est nouvelle dans le .NET Framework version 2.0. – monoco

+0

Ahh, désolé, n'a pas vu le 1.1 dans mon excitation pour répondre à la question. – Joshua

0

Après avoir vu le .NET 1.1, vérifiez ce fil sur: http://forums.asp.net/t/434077.aspx, en utilisant le lockoutTime dans le filtre doit encore faire l'affaire.

Plus précisément dans le fil (après le code postal plus grand qui fournit beaucoup de la syntaxe):

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

Une autre chose, il se avère que si vous utilisez v.1.1 .NET, puis S. DS convertit le Integer8 à long entier correctement pour vous (ne fonctionne pas avec 1.0) - ce qui signifie que vous pouvez en finir avec le code de réflexion (au poste):

//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()); 

}