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
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
Por lo que recuerdo, debería aplicarse a las cuentas locales también. – splattne
@ Mohammadreza: Actualicé mi respuesta. Ahora hay un código que maneja las cuentas locales – splattne