2017-12-20 3 views
-1

Ich brauche eine Liste von Benutzern aus Active Directory, deren Passwörter bald ablaufen (sagen wir in 5 Tagen).Active Directory - Holen Sie sich die Liste der Benutzer mit Passwort in Kürze

Ich muss dies tun, indem Sie einen Filter zu DirectorySearcher hinzufügen, da es am schnellsten sein wird. Ich habe das samaccountname Muster zum Filter hinzugefügt, aber ich kann nicht herausfinden, wie man pwdLastSet ihm hinzufügt. Idealerweise würde der Filter die Benutzerliste auf diejenigen reduzieren, die die Kriterien zum Ablauf des Passworts erfüllen.

 using (DirectoryEntry searchRoot = GetXYZAccountOU()) 
     { 
      DirectorySearcher ds = new DirectorySearcher(searchRoot); 
      ds.SearchScope = SearchScope.Subtree; 

      ds.Filter = "(&" +         
          "(samaccountname=XYZ*)" 
      + ")"; 


      SearchResultCollection result = ds.FindAll(); 

      foreach (SearchResult searchResult in result) 
      { 
       var de = searchResult.GetDirectoryEntry(); 
       //long pwdLastSetVal = (long)de.Properties["pwdLastSet"][0]; 

       //Console.WriteLine(de.Properties["displayName"].Value + ": " + DateTime.FromFileTimeUtc(pwdLastSetVal)); 
       Console.WriteLine(de.Properties["displayName"].Value); 
      } 

      Console.Read(); 
     } 

Hier XYZ ist die Anfangsbuchstaben meines Benutzer samaccountname.

Wenn ich diesen Code ausführen kann ich die displayName und einige andere Attribute erhalten, aber nicht die pwdLastSet oder das berechnete Attribut msDS-UserPasswordExpiryTimeComputed, während ich sie beide in dem Active Directory-Browser sehen.

+1

werden Sie dies mit Principal für ein Beispiel hier besser dran tun https://stackoverflow.com/questions/5535829/principalcontext-userprincipal-how-to-know-when- password-expires – MethodMan

+0

Ich wusste, dass wir das Passwort-Ablaufdatum für einen einzelnen Benutzer mit UserPrincipal finden können, aber ich muss die Liste der Benutzer finden, deren Passwort in ein paar Tagen abläuft. Wenn ich die Liste aller Benutzer erhalte und dann über sie iteriere, um das Ablaufdatum für jeden von ihnen zu finden, wäre es vom Leistungspunkt aus sehr schlecht. – Danish

+0

Sie können das auch tun, wie machen Sie das derzeit für einen einzelnen Benutzer? mach das gleiche, aber mach es innerhalb einer for-Schleife oder einer foreach-Schleife. Sie müssen Seite der Box – MethodMan

Antwort

0

Sie müssen im Voraus wissen, wie lange Passwörter gültig sind, und das Attribut pwdLastSet abfragen. Aber natürlich ist das Datum in einem seltsamen Format gespeichert.

Nehmen wir an, sie sind für 30 Tage gültig. Dann können Sie die Abfrage wie folgt konstruieren:

var date = DateTime.Now.AddDays(-30).ToFileTime(); 
var query = $"(&(objectclass=user)(objectcategory=person)(!pwdlastset=0)(pwdlastset<={date})(!userAccountControl:1.2.840.113556.1.4.803:=65536))"; 

Accounts eingestellt werden kann, niemals Passwörter ablaufen, so dass Sie sich für das in der Abfrage zu berücksichtigen. Die userAccountControl Bedingung tut das.

Wenn Sie keine magische Zahl in Ihrem Code verwenden möchten, können Sie nachsehen, wie lange Passwörter in der Domäne gültig sind, indem Sie das Attribut maxPwdAge im Stammverzeichnis der Domäne (das in einem andere, seltsames Format):

var domain = new DirectoryEntry("LDAP://domain.com"); 
Int64 pwdAge = (Int64) domain.Properties["maxPwdAge"][0]; 
var maxPwdAge = pwdAge/-864000000000; //convert to days 
Verwandte Themen