2013-08-14 19 views
5

Ich versuche, das Ablaufdatum von Konten abzurufen.Abrufen des Benutzerkontos von ActiveDirectory

Ich habe versucht,

DirectoryEntry user = new DirectoryEntry(iMem); 

var AccountExpiration = DateTime.FromFileTime((int)user.Properties["accountExpires"].Value); 

es nicht funktioniert, gibt mir nur die Fehlermeldung „angegebene Umwandlung ist ungültig“.

Wenn ich

var AccountExpiration = user.Properties["accountExpires"]; 

ein COM-Objekt zurückgibt, die ich nicht in der Lage bin zu lesen.

Windows Power verwenden, funktioniert gut, ich verstehe nicht, warum dies nicht funktionieren ...

dies ist der Code ich in Powershell verwenden

$Expires = [datetime]::FromFileTime($tmpUser.accountExpires) 

Antwort

10

Sie den System.DirectoryServices.AccountManagement Namespace verwenden können, zu erreichen diese Aufgabe. Sobald Sie eine UserPrincipal von einer PrincipalContext erhalten, können Sie die UserPrincipal.AccountExpirationDate Eigenschaft überprüfen.

PrincipalContext context = new PrincipalContext(ContextType.Domain); 

UserPrincipal p = UserPrincipal.FindByIdentity(context, "Domain\\User Name"); 

if (p.AccountExpirationDate.HasValue) 
{ 
    DateTime expiration = p.AccountExpirationDate.Value.ToLocalTime(); 
} 

Wenn Sie DirectoryEntry verwenden möchten tun, dies tun:

//assume 'user' is DirectoryEntry representing user to check 
DateTime expires = DateTime.FromFileTime(GetInt64(user, "accountExpires")); 

private Int64 GetInt64(DirectoryEntry entry, string attr) 
{ 
    //we will use the marshaling behavior of the searcher 
    DirectorySearcher ds = new DirectorySearcher(
    entry, 
    String.Format("({0}=*)", attr), 
    new string[] { attr }, 
    SearchScope.Base 
    ); 

    SearchResult sr = ds.FindOne(); 

    if (sr != null) 
    { 
     if (sr.Properties.Contains(attr)) 
     { 
      return (Int64)sr.Properties[attr][0]; 
     } 
    } 

    return -1; 
} 

Ein anderer Weg, um die accountExpires Wert von Parsen wird mithilfe von Reflektion:

private static long ConvertLargeIntegerToLong(object largeInteger) 
{ 
    Type type = largeInteger.GetType(); 

    int highPart = (int)type.InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null); 
    int lowPart = (int)type.InvokeMember("LowPart", BindingFlags.GetProperty | BindingFlags.Public, null, largeInteger, null); 

    return (long)highPart <<32 | (uint)lowPart; 
} 

object accountExpires = DirectoryEntryHelper.GetAdObjectProperty(directoryEntry, "accountExpires"); 
var asLong = ConvertLargeIntegerToLong(accountExpires); 

if (asLong == long.MaxValue || asLong <= 0 || DateTime.MaxValue.ToFileTime() <= asLong) 
{ 
    return DateTime.MaxValue; 
} 
else 
{ 
    return DateTime.FromFileTimeUtc(asLong); 
} 
Verwandte Themen