2013-09-04 6 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; 
     } 
    } 

Il metodo di cui sopra funziona alla grande per più di Active Directory ad eccezione di quelli che sono legati alla data/ora come pwdLastSet, maxPwdAge, eccCome convertire pwdLastSet Active Directory per Data/Ora

La mia domanda è come ho la pwdLastSet a un datetime leggibile (come 2013/08/13 o 13 agosto, 2013, ecc)

ho tentativi questo, ma ha gettato eccezioni

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

sono u cantare il seguente codice per ottenere il tempo come un Int64

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

Poi ho intenzione di utilizzare il DateTime (Int64) costruzione per creare un DateTime

risposta

9

Secondo the MSDN documentation:

Questo valore è memorizzato come un numero intero di grandi dimensioni che rappresenta il numero di intervalli di 100 nanosecondi dal 1 ° gennaio 1601 (UTC).

Questo si allinea perfettamente con DateTime.FromFileTimeUtc, as described here.

E non sono sicuro del motivo per cui si avverte la necessità di eseguire la manipolazione di basso livello dell'intero. Penso che potresti semplicemente scriverlo.

Quindi basta fare:

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

è possibile ottenere l'ultima password data di un utente directory in forma leggibile impostare facile come torta. Per ottenere ciò è possibile utilizzare la proprietà nullable LastPasswordSet della classe UserPrincipal dallo spazio dei nomi System.DirectoryServices.AccountManagement.

Se l'opzione User must change password at next logon è selezionata, quindi LastPasswordSet proprietà restituisce null valore. Altrimenti restituisce l'ultima data e ora in cui la password è stata impostata nel tipo 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

Problemi correlati