Création d'un compte d'utilisateur local c# and.NET 2,0

Comment puis-je créer un compte utilisateur local en utilisant .NET 2.0 et c# et aussi être capable de définir le "mot de passe n'expire jamais" à jamais.

j'ai essayé d'utiliser "Net.exe " utilisant un procédé.Démarrer et passer ses paramètres mais il semble que le " net user "est incapable de définir le" Password never expires " à never.

20
demandé sur Joseph Ferris 2008-12-21 12:53:43

3 réponses

Lire cet excellent CodeProject article

Howto: (Presque) Tout Dans Active Directory via C#

il y a une section "Create User Account" et "Dealing with User Passwords".

mise à jour:

pour adapter le code pour les comptes locaux, remplacer les lignes respectives par celles-ci:

DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + 
    Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");

voici le début de l'extrait de code original pour le domaine comptes:

public string CreateUserAccount(string ldapPath, string userName, 
    string userPassword)
{
    string oGUID = string.Empty;
    try
    {          
        string connectionPrefix = "LDAP://" + ldapPath;
        DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix);
        DirectoryEntry newUser = dirEntry.Children.Add
            ("CN=" + userName, "user");
        newUser.Properties["samAccountName"].Value = userName;

        int val = (int)newUser.Properties["userAccountControl"].Value; 
        newUser.Properties["userAccountControl"].Value = val | 0x10000; 

        newUser.CommitChanges();
        oGUID = newUser.Guid.ToString();

        newUser.Invoke("SetPassword", new object[] { userPassword });
        newUser.CommitChanges();

        dirEntry.Close();
        newUser.Close();
    }
    catch (System.DirectoryServices.DirectoryServicesCOMException E)
    {
        //DoSomethingwith --> E.Message.ToString();    
    }
    return oGUID;
}

il y a des détails à comprendre lorsqu'il s'agit de mots de passe d'utilisateur et les limites autour des mots de passe tels que forcer un utilisateur à changer son mot de passe lors de la prochaine connexion l'utilisateur le droit de modifier leurs propres mots de passe, définir des mots de passe à jamais expiration, pour le moment de l'expiration, et ces les tâches peuvent être accomplies en utilisant Les drapeaux UserAccountControl qui sont démontré dans le cadre de l'instance section.

Veuillez vous référer à cette grande article MSDN: Gestion des mots de passe Utilisateur pour des exemples et de la documentation au sujet de ces caractéristiques.

CONST                          HEX
------------------------------------------
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
22
répondu splattne 2014-05-14 06:41:23

Ce code va créer un compte local avec le mot de passe n'expire jamais option:

        using System.DirectoryServices;

        DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost");
        DirectoryEntries entries = hostMachineDirectory.Children;
        bool userExists = false;
        foreach (DirectoryEntry each in entries)
        {
            userExists = each.Name.Equals("NewUser",  
            StringComparison.CurrentCultureIgnoreCase);
            if (systemtestUserExists)
                break;
        }

        if (false == userExists)
        {
            DirectoryEntry obUser = entries.Add("NewUser", "User");
            obUser.Properties["FullName"].Add("Local user");
            obUser.Invoke("SetPassword", "abcdefg12345@");
            obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
            obUser.CommitChanges();
        }

j'ai passé beaucoup de temps à comprendre comment créer un compte d'utilisateur local avec le mot de passe réglé pour ne pas expirer. Il semble que, lorsque vous essayez d'utiliser:

int val = (int)newUser.Properties["userAccountControl"].Value; 
newUser.Properties["userAccountControl"].Value = val | 0x10000

les permissions de active directory entrent en jeu. Si vous avez les permissions Active directory, tout fonctionne très bien. Si vous ne le faites pas alors obtenir le la propriété userAccountControl se traduira toujours par une valeur nulle. Essayer de définir userAccountControl aboutira à une exception "la Propriété directory ne peut pas être trouvée dans le cache".

cependant après beaucoup de chasse autour de moi j'ai trouvé une autre propriété "UserFlags" qui doit être réglée en utilisant Invoke. Vous pouvez l'utiliser pour placer le drapeau sur un compte local. J'ai essayé ce code et il a fonctionné sur Windows server 2008.

J'espère que cela aidera

21
répondu Ed Sykes 2009-03-24 11:52:39

utilisation du système.DirectoryServices;

    DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://localhost");
    DirectoryEntries entries = hostMachineDirectory.Children;
    bool userExists = false;
    foreach (DirectoryEntry each in entries)
    {
        userExists = each.Name.Equals("NewUser",  
        StringComparison.CurrentCultureIgnoreCase);
        if (systemtestUserExists)
            break;
    }

    if (false == userExists)
    {
        DirectoryEntry obUser = entries.Add("NewUser", "User");
        obUser.Properties["FullName"].Add("Local user");
        obUser.Invoke("SetPassword", "abcdefg12345@");
        obUser.Invoke("Put", new object[] {"UserFlags", 0x10000});
        obUser.CommitChanges();
0
répondu Mark Kevin Cuizon 2013-02-28 03:25:55