Pregunta

¿Cómo puedo crear una cuenta de usuario local utilizando .NET 2.0 y C # y también ser capaz de establecer la "contraseña nunca caduca" para que nunca.

He intentado usar "Net.exe" usando Process.Start y pasando sus parámetros, pero parece que el "net user" es incapaz de establecer la "contraseña nunca caduca" para que nunca.

¿Fue útil?

Solución

Lea este excelente artículo CodeProject

Como: (casi) todo En Active Directory a través de C #

Hay una sección "Crear una cuenta de usuario" y "Tratar con las contraseñas de usuario".

ACTUALIZACIÓN:

Para adaptar el código para las cuentas locales sustituyen a las líneas respectivas con las siguientes:

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

Aquí comienza el fragmento de código original para cuentas de dominio:

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

Hay algunos detalles para comprender   cuando se trata de contraseñas de usuario y   límites en torno a las contraseñas, tales como   obligando a un usuario cambiar su   contraseña en el siguiente inicio de sesión, negando   al usuario el derecho a cambiar su propia   contraseñas, de la contraseñas a que nunca   expirar, cuando a punto de expirar, y estos   tareas se pueden realizar utilizando   banderas que son UserAccountControl   demostrado en el procedimiento   secciones.

     

Por favor refiérase a este gran    MSDN artículo: Gestión de contraseñas de usuario   para ejemplos y documentación   con respecto a estas características.

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

Otros consejos

Este código va a crear una cuenta local con la contraseña nunca caduca conjunto de opciones:

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

La bandera 0x10000 significa PasswordNeverExpires.

Pasé mucho tiempo pensando cómo crear una cuenta de usuario local con la contraseña establecida no expire. Parece que cuando intenta utilizar:

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

permisos de directorio activo entran en juego. Si tiene permisos de directorio activo todo funciona bien. Si no a continuación, obtener la propiedad userAccountControl siempre resultará en un valor nulo. Tratando de establecer userAccountControl dará lugar a una excepción "La propiedad de directorio no se puede encontrar en la caché".

Sin embargo después de mucha caza alrededor encontré otra propiedad "UserFlags" que necesita ser ajustado con el invocación. Usted puede usar esto para establecer el indicador en una cuenta local. He probado este código y funcionó en Windows Server 2008.

Espero que esto ayude

usando 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top