users - reset password identity c#
Creando una cuenta de usuario local c#y.NET 2.0 (3)
¿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.
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();
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