Creando una cuenta de usuario local c # y .NET 2.0

¿Cómo puedo crear una cuenta de usuario local usando .NET 2.0 yc # y también poder configurar “La contraseña nunca caduca” para nunca?

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.

Lea este excelente artículo de CodeProject

Cómo: (Casi) todo en Active Directory a través de C #

Hay una sección “Crear cuenta de usuario” y “Manejo de contraseñas de usuario”.

ACTUALIZAR:

Para adaptar el código a las cuentas locales, reemplace las líneas respectivas por estas:

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

Aquí comienza el fragmento de código original para las 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 que se deben tener en cuenta al tratar con contraseñas y límites de usuario en contraseñas, como forzar a un usuario a cambiar su contraseña en el siguiente inicio de sesión, denegarle al usuario el derecho de cambiar sus propias contraseñas, establecer contraseñas que nunca caducan y cuándo caducar , y estas tareas se pueden llevar a cabo utilizando indicadores UserAccountControl que se demuestran en las secciones anteriores.

Consulte este excelente artículo de MSDN: Administración de contraseñas de usuario para obtener ejemplos y documentación sobre 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 

Este código creará una cuenta local con la opción de contraseña nunca caduca configurada:

  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 descifrando cómo crear una cuenta de usuario local con la contraseña establecida para que no caduque. Parece que cuando intentas usar:

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

los permisos del directorio activo entran en juego. 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.

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