2013-09-04 22 views
7
public static string GetProperty(SearchResult searchResult, string PropertyName) 
    { 
     if (searchResult.Properties.Contains(PropertyName)) 
     { 
      return searchResult.Properties[PropertyName][0].ToString(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 

Powyższa metoda działa świetnie na właściwości najbardziej Active Directory z wyjątkiem tych, które są związane z data/czas, takich jak pwdLastSet, maxPwdAge itpJak przekonwertować usługi Active Directory, aby pwdLastSet Date/Time

moje pytanie brzmi: jak uzyskać pwdLastSet do czytelnej datetime (jak 8/13/2013 lub 13 sierpnia 2013 roku, etc)

mam próbuje to jednak odrzucił wyjątki

public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger) 
{ 
    var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null); 
    var lowPart = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null); 
    return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart; 
} 

Jestem u śpiewać następujący kod aby uzyskać czas jako Int64

Int64 passwordLastSet = ConvertADSLargeIntegerToInt64(objResult.Properties["pwdLastSet"][0]); 

Potem planowane jest używanie DateTime (Int64) Konstruktor, aby utworzyć DateTime

Odpowiedz

9

Według the MSDN documentation:

wartość ta jest przechowywane jako duża liczba całkowita, która reprezentuje liczbę 100 nanosekundowych odstępów od 1 stycznia 1601 (UTC).

To idealnie pasuje do DateTime.FromFileTimeUtc, as described here.

I nie jestem pewien, dlaczego czujesz potrzebę manipulowania liczbą całkowitą niskiego poziomu. Myślę, że możesz po prostu go rzucić.

Więc po prostu zrobić:

long value = (long)objResult.Properties["pwdLastSet"][0]; 
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value); 
1

Można dostać ostatnią datę hasło użytkownika katalogów w postaci czytelnej dla człowieka ustawiony tak łatwe, jak ciasto. Aby to osiągnąć, możesz użyć zerowej klasy LastPasswordSet klasy UserPrincipal z przestrzeni nazw System.DirectoryServices.AccountManagement.

Jeśli zaznaczona jest opcja User must change password at next logon, wówczas właściwość LastPasswordSet zwraca wartość null. W przeciwnym razie zwraca ostatnią datę i godzinę ustawienia hasła w typie DateTime.

using(PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
{ 
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, Username); 
    //? - to mark DateTime type as nullable 
    DateTime? pwdLastSet = (DateTime?)user.LastPasswordSet; 
    ... 
} 

MSDN: UserPrincipal
MSDN: LastPasswordSet