2016-03-23 7 views
1

Ich habe ein Skript, das ausgeführt wird, wenn ein Benutzer einen neuen Benutzer anfordert.C# ASP.NET - Suche AD für aktive und "suspendierte" Benutzer

Dieses Skript nimmt den vom Benutzer angegebenen Benutzernamen und sucht nach AD, um festzustellen, ob es existiert. Dies funktioniert absolut gut, aber unsere IT-Abteilung hat Verfallsdaten auf Konten. Dies führt dazu, dass sich das Konto in einer Art "suspended" Status befindet und nicht deaktiviert wird, bis es in eine separate OU für Mitarbeiter versetzt wird, die gegangen sind.

Die C# AD-Suche ignoriert diese gesperrten Konten.

Ist jemand schon einmal auf dieses Problem gestoßen? Oder hat jemand eine Idee, wie diese Benutzer bei der Suche berücksichtigt werden können?

public static string ADSearch(string ADPart, string Alias) 
{ 
    System.DirectoryServices.DirectoryEntry dirEntry = default(System.DirectoryServices.DirectoryEntry); 
    System.DirectoryServices.DirectorySearcher dirSearcher = default(System.DirectoryServices.DirectorySearcher); 
    try 
    { 
     dirEntry = new System.DirectoryServices.DirectoryEntry("LDAP://LDAP DETAILS HERE"); 

     dirSearcher = new System.DirectoryServices.DirectorySearcher(dirEntry); 
     dirSearcher.Filter = "(samaccountname=" + Alias + ")"; 

     dirSearcher.PropertiesToLoad.Add("GivenName"); 
     //Users first name 
     dirSearcher.PropertiesToLoad.Add("sn"); 
     //Users last name 
     dirSearcher.PropertiesToLoad.Add("mail"); 
     //Users e-mail 
     dirSearcher.PropertiesToLoad.Add("samaccountname"); 
     //Samaccount 
     StringBuilder groupNames = new StringBuilder(); //stuff them in | delimited 


     SearchResult sr = dirSearcher.FindOne(); 
     //return false if user isn't found 


     if (sr != null) 
      if (ADPart == "GivenName") 
       return sr.Properties["GivenName"][0].ToString().Replace("'", ""); 
      else if (ADPart == "sn") 
       return sr.Properties["sn"][0].ToString().Replace("'", ""); 
      else if (ADPart == "mail") 
       return sr.Properties["mail"][0].ToString().Replace("'", ""); 
      else if (ADPart == "alias") 
       return sr.Properties["samaccountname"][0].ToString().Replace("'", ""); 
      else 
       return null; 
     else 
      return null; 

     // return false if exception occurs 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
} 

Könnte erwähnen, dass ich diesen Code nicht geschrieben habe und es bereits vorhanden war.

Jede Hilfe wird sehr geschätzt.

Antwort

0

Hier ist ein Code, der für Sie arbeiten sollte.

Zuerst fügen „accountExpires“ zu PropertiesToLoad, dann können Sie diese verwenden, um zu sehen, ob das Konto abgelaufen ist:

var isExpired = false; 
if (sr.Properties.Contains("accountExpires")) { 
    var expiry = (long)sr.Properties["accountExpires"][0]; 
    if (!expiry.Equals(9223372036854775807) && !expiry.Equals(0)) { 
     isExpired = DateTime.FromFileTime(expiry) <= DateTime.Now; 
    } 
} 

die magischen Zahlen sind, weil, wie the documentation states „, wird ein Wert von 0 oder 0x7FFFFFFFFFFFFFFF (9223372036854775807) zeigt an, dass das Konto niemals abläuft. "

+0

Hallo Gabriel, vielen Dank für die Details Antwort. Du weißt bestimmt, wovon du sprichst. Leider entspricht dies meinen Anforderungen nicht, da die Abfrage überhaupt keine abgelaufenen Konten anzeigt, sodass sie nicht gezählt werden können. Danke noch einmal! –

+0

Bei dieser bestimmten Suche wird nur jeweils nach einem Konto gesucht: "(samaccountname =" + Alias ​​+ ")". Was füttert die Kontonamen auf diese Methode? –

+0

Es gibt ein Textfeld, in dem ein Administrator einen Benutzernamen eingeben kann. Was immer sie eingeben, wird bei der Suche verwendet. –

Verwandte Themen