2010-01-05 4 views
49

Sto lanciando una rapida app per moduli C# per aiutare a risolvere un lavoro clericale ripetitivo.Come determinare se l'account utente è abilitato o disabilitato

Ho eseguito una ricerca in AD per tutti gli account utente e li sto aggiungendo a una visualizzazione elenco con caselle di controllo.

Vorrei impostare lo stato di controllo predefinito di listviewitems in modo che dipenda dallo stato abilitato/disabilitato dell'account.

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

Non riesco a trovare l'attributo corretto da analizzare per ottenere lo stato dell'account dall'oggetto DirectoryEntry. Ho cercato AD User attributes, ma non ho trovato nulla di utile.

Qualcuno può offrire qualche suggerimento?

risposta

85

questo codice qui dovrebbe funzionare ...

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

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

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

Funziona perfettamente grazie. – Bryan

+21

Accidenti, sei più veloce, ma qui c'è un link su cosa significano tutte le bandiere: http://msdn.microsoft.com/en-us/library/ms680832.aspx – Oliver

+0

thx per il tuo commento :) +1 –

5

Non che qualcuno ha chiesto, ma ecco una versione di Java (da quando ho finito qui alla ricerca di uno). Il controllo nulla viene lasciato come esercizio per il lettore.

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

Voto in eccesso per il tempo di condividere perché il titolo non è specifico per la lingua e questo potrebbe davvero aiutare qualcuno. – allen1

5

Utilizzando System.DirectoryServices.AccountManagement: domainName e nome utente devono essere i valori di stringa del dominio e nome utente.

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' è ciò che ha funzionato per me –