2008-12-21 30 views
19

¿Cómo puedo crear una cuenta de usuario local usando .NET 2.0 y C# y también ser capaz de configurar la "Contraseña nunca caduca" a nunca.Crear cuenta de usuario local C# y .NET 2.0

He intentado usar "Net.exe" usando Process.Start y pasando sus parámetros, pero parece que el "usuario de red" no puede establecer que "La contraseña nunca caduque" a nunca.

Respuesta

21

Leer este excelente artículo CodeProject

Howto: (Almost) Everything In Active Directory via 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 estos:

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 alrededor de contraseñas como obligando a un usuario cambiar su contraseña en el siguiente inicio de sesión, negando al usuario el derecho a cambiar sus propias contraseñas, configurar contraseñas nunca caducarán, hasta que caduque, y estas tareas se pueden llevar a cabo utilizando banderas de control de cuenta de usuario que son demostradas en las secciones que proceden.

favor refiérase a este gran MSDN article: Managing User Passwords de ejemplos y documentación relacionados con estas funciones.

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 
+0

Los enlaces que ha especificado corresponden al directorio activo. Quizás no estaba claro. Quiero cambiar la cuenta de usuario local (la computadora no es parte de un directorio activo). – mrtaikandi

+0

Por lo que recuerdo, debería aplicarse a las cuentas locales también. – splattne

+0

@ Mohammadreza: Actualicé mi respuesta. Ahora hay un código que maneja las cuentas locales – splattne

21

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", "[email protected]"); 
      obUser.Invoke("Put", new object[] {"UserFlags", 0x10000}); 
      obUser.CommitChanges(); 
     } 

El 0x10000 bandera significa PasswordNeverExpires.

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

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

entran en juego los permisos del directorio activo. Si tiene permisos de directorio activo, todo funciona bien. Si no lo hace, obtener la propiedad userAccountControl siempre dará como resultado un valor nulo. Intentar establecer userAccountControl dará como resultado una excepción "La propiedad del directorio no se puede encontrar en el caché".

Sin embargo, después de mucho buscar, encontré otra propiedad, "UserFlags", que debe establecerse utilizando Invoke. Puede usar esto para establecer el indicador en una cuenta local. Probé este código y funcionó en Windows Server 2008.

Esperanza esto ayuda

+0

Bueno, +1. Un par de notas: primero, DirectoryEntry es desechable, así que mejor envuelve con a usando {}; segundo, el constructor de entrada de directorio puede tomar un nombre de máquina remota si necesita crear un usuario local en un cuadro remoto. –

0

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", "[email protected]"); 
     obUser.Invoke("Put", new object[] {"UserFlags", 0x10000}); 
     obUser.CommitChanges(); 
Cuestiones relacionadas