La creación de cuenta de usuario local de C # y .NET 2.0
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.
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();