2016-03-23 17 views
1

Kullanıcı yeni bir kullanıcı istediğinde çalıştırılacak bir komut dosyası var.C# ASP.NET - Aktif ve 'askıya alınmış' kullanıcılar için AD ara

Bu betik kullanıcı tarafından sağlanan kullanıcı adını alacak ve var olup olmadığını görmek için AD'yi arayacaktır. Bu kesinlikle gayet iyi çalışıyor, ancak BT departmanımızın hesaplarda son kullanma tarihleri ​​var. Bu, hesabın, ayrılan personel için ayrı bir YB'ye taşınana kadar, bir tür "askıya alınmış" durumda, devre dışı değilken sonuçlanmasıyla sonuçlanır.

C# AD araması bu askıya alınmış hesapları yok sayıyor.

Daha önce bu konuyla karşılaşan var mı? Ya da bu kullanıcılar için bu kullanıcılara nasıl uyum sağlayacağı konusunda bir ipucu var mı?

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

Bu kodu yazmadım ve yerine zaten belirterek değerinde olabilir.

Herhangi bir yardım çok takdir edilmektedir.

cevap

0

İşte sizin için çalışması gereken bir kod.

Birincisi, o zaman hesap süresi dolmuş olup olmadığını görmek için kullanabilir, PropertiesToLoad için "accountExpires" ekleyin:

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

sihirli sayılar

vardır, çünkü the documentation states, "0 veya 0x7FFFFFFFFFFFFFFF bir değere (olarak 9223372036854775807), hesabın hiçbir zaman sona ermediğini gösterir. "

+0

Merhaba Gabriel, ayrıntılar yanıtı için çok teşekkürler. Ne hakkında konuştuğunu kesinlikle biliyorsun. Ne yazık ki, bu sorgu süresi dolmuş hesapları görmediğinden, bu durum ihtiyaçlarıma uymuyor, dolayısıyla bunları sayamaz. Tekrar teşekkürler! –

+0

Bu özel arama, bir kerede yalnızca bir hesap arıyor, buna dayanarak: "(samaccountname =" + Alias ​​+ ")". Öyleyse hesap isimlerini bu yönteme ne veriyor? –

+0

Bir yöneticinin bir kullanıcı adı girebileceği bir metin kutusu var. Yazdıkları her şey aramada kullanılır. –