75 votes

Comment déterminer si un compte utilisateur est activé ou désactivé ?

Je suis en train de créer une application rapide de formulaires gagnants en C# pour aider à résoudre un travail de bureau répétitif.

J'ai effectué une recherche dans AD pour tous les comptes d'utilisateur et je les ajoute à une vue de liste avec des cases à cocher.

Je voudrais que l'état de vérification par défaut des éléments de la liste dépende de l'état activé/désactivé du compte.

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

J'ai du mal à trouver le bon attribut à analyser pour obtenir l'état du compte à partir de l'objet DirectoryEntry. J'ai cherché Attributs des utilisateurs AD mais je n'ai rien trouvé d'utile.

Quelqu'un peut-il me donner des conseils ?

133voto

Dimi Toulakis Points 3002

Ce code ici devrait fonctionner...

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

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

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

27 votes

Bon sang, tu es plus rapide, mais voici un lien sur la signification de tous les drapeaux : msdn.microsoft.com/fr/us/library/ms680832.aspx

5 votes

Peut-être que ce lien complétera celui d'Oliver Drapeaux

2 votes

Si flags est égal à zéro, cela retournera vrai, ce qui est incorrect - juste une note pour gérer ce cas.

14voto

Michelle Points 151

En utilisant System.DirectoryServices.AccountManagement : domainName et username doivent être les valeurs de chaîne du domaine et du nom d'utilisateur.

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

12voto

user3006472 Points 1

Non pas que quelqu'un ait demandé, mais voici une version java (puisque j'ai atterri ici en en cherchant une). La vérification de la nullité est laissée comme un exercice pour le lecteur.

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 votes

Upvote pour avoir pris le temps de partager parce que le titre n'est pas spécifique à une langue et que cela pourrait vraiment aider quelqu'un.

0voto

boboes Points 616

Vous pouvez utiliser quelque chose comme ça :

    ADUserAccountControl flags;
    Enum.TryParse(de.Properties["userAccountControl"].Value.ToString(), out flags);

    if(flags.HasFlag(ADUserAccountControl.ACCOUNTDISABLE)
    {
        // account is disabled
    }

Voici une liste complète de tous les drapeaux possibles :

    /// <summary>
    /// Source: https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties
    /// </summary>
    public enum ADUserAccountControl : long
    {
        SCRIPT = 0x0001,
        ACCOUNTDISABLE = 0x0002,
        HOMEDIR_REQUIRED = 0x0008,
        LOCKOUT = 0x0010,
        PASSWD_NOTREQD = 0x0020,
        PASSWD_CANT_CHANGE = 0x0040,
        ENCRYPTED_TEXT_PWD_ALLOWED = 0x0080,
        TEMP_DUPLICATE_ACCOUNT = 0x0100,
        NORMAL_ACCOUNT = 0x0200,
        INTERDOMAIN_TRUST_ACCOUNT = 0x0800,
        WORKSTATION_TRUST_ACCOUNT = 0x1000,
        SERVER_TRUST_ACCOUNT = 0x2000,
        DONT_EXPIRE_PASSWORD = 0x10000,
        MNS_LOGON_ACCOUNT = 0x20000,
        SMARTCARD_REQUIRED = 0x40000,
        TRUSTED_FOR_DELEGATION = 0x80000,
        NOT_DELEGATED = 0x100000,
        USE_DES_KEY_ONLY = 0x200000,
        DONT_REQ_PREAUTH = 0x400000,
        PASSWORD_EXPIRED = 0x800000,
        TRUSTED_TO_AUTH_FOR_DELEGATION = 0x1000000,
        PARTIAL_SECRETS_ACCOUNT = 0x04000000,
    }

-1voto

Nichtmetall Points 1

Je suis venu ici pour chercher une réponse, mais c'était seulement pour DirectoryEntry . Voici donc un code qui fonctionne pour SearchResult / SearchResultCollection pour les personnes qui ont eu le même problème :

private bool checkIfActive(SearchResult sr)
{
    var vaPropertiy = sr.Properties["userAccountControl"];

    if (vaPropertiy.Count > 0) 
    {
        if (vaPropertiy[0].ToString() == "512" || vaPropertiy[0].ToString() == "66048") 
        {
            return true;
        } 

        return false;
    }

    return false;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X