2010-01-05 17 views
49

Ich werfe eine schnelle C# -Winform-App zusammen, um einen sich wiederholenden Bürojob zu lösen.So ermitteln Sie, ob das Benutzerkonto aktiviert oder deaktiviert ist

Ich habe eine Suche in AD für alle Benutzerkonten durchgeführt und füge sie zu einer Listenansicht mit Kontrollkästchen hinzu.

Ich möchte den Standard-Check-Status der listviewitems standardmäßig auf den aktivierten/deaktivierten Status des Kontos abhängen.

string path = "LDAP://dc=example,dc=local"; 
DirectoryEntry directoryRoot = new DirectoryEntry(path); 
DirectorySearcher searcher = new DirectorySearcher(directoryRoot, 
    "(&(objectClass=User)(objectCategory=Person))"); 
SearchResultCollection results = searcher.FindAll(); 
foreach (SearchResult result in results) 
{ 
    DirectoryEntry de = result.GetDirectoryEntry(); 
    ListViewItem lvi = new ListViewItem(
     (string)de.Properties["SAMAccountName"][0]); 
    // lvi.Checked = (bool) de.Properties["AccountEnabled"] 
    lvwUsers.Items.Add(lvi); 
} 

Ich bin schwer zu finden, das richtige Attribut zu analysieren, um den Status des Kontos aus dem DirectoryEntry-Objekt zu erhalten. Ich habe nach AD User attributes gesucht, aber nichts nützliches gefunden.

Kann jemand irgendwelche Zeiger anbieten?

Antwort

85

dieser Code hier sollte funktionieren ...

private bool IsActive(DirectoryEntry de) 
{ 
    if (de.NativeGuid == null) return false; 

    int flags = (int)de.Properties["userAccountControl"].Value; 

    return !Convert.ToBoolean(flags & 0x0002); 
} 
+0

Funktioniert perfekt danke. – Bryan

+21

Verdammt, du bist schneller, aber hier ist ein Link darüber, was alle Flaggen bedeuten: http://msdn.microsoft.com/en-us/library/ms680832.aspx – Oliver

+0

thx für Ihren Kommentar :) +1 –

5

Nicht, dass jemand gefragt, aber hier ist eine Java-Version (da ich hier gelandet für einen Blick). Die Nullkontrolle wird dem Leser als Übung überlassen.

private Boolean isActive(SearchResult searchResult) { 
    Attribute userAccountControlAttr = searchResult.getAttributes().get("UserAccountControl"); 
    Integer userAccountControlInt = new Integer((String) userAccoutControlAttr.get()); 
    Boolean disabled = BooleanUtils.toBooleanObject(userAccountControlInt & 0x0002); 
    return !disabled; 
} 
+0

Upvote für die Zeit zu teilen, weil der Titel nicht sprachspezifisch ist und dies könnte wirklich jemandem helfen. – allen1

5

Mit System.DirectoryServices.AccountManagement: domainname und username müssen die Stringwerte der Domäne und den Benutzernamen sein.

using (var domainContext = new PrincipalContext(ContextType.Domain, domainName)) 
{ 
    using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, username)) 
    { 
     if (foundUser.Enabled.HasValue) 
     { 
      return (bool)foundUser.Enabled; 
     } 
     else 
     { 
      return true; //or false depending what result you want in the case of Enabled being NULL 
     } 
    } 
} 
+0

'((UserPrincipal) foundUser) .Enabled == true' ist, was bei mir funktioniert hat –

Verwandte Themen