Création d'un compte d'utilisateur local c# and.NET 2,0
Comment puis-je créer un compte utilisateur local en utilisant .NET 2.0 et c# et aussi être capable de définir le "mot de passe n'expire jamais" à jamais.
j'ai essayé d'utiliser "Net.exe " utilisant un procédé.Démarrer et passer ses paramètres mais il semble que le " net user "est incapable de définir le" Password never expires " à never.
3 réponses
Lire cet excellent CodeProject article
Howto: (Presque) Tout Dans Active Directory via C#
il y a une section "Create User Account" et "Dealing with User Passwords".
mise à jour:
pour adapter le code pour les comptes locaux, remplacer les lignes respectives par celles-ci:
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" +
Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");
voici le début de l'extrait de code original pour le domaine comptes:
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;
}
il y a des détails à comprendre lorsqu'il s'agit de mots de passe d'utilisateur et les limites autour des mots de passe tels que forcer un utilisateur à changer son mot de passe lors de la prochaine connexion l'utilisateur le droit de modifier leurs propres mots de passe, définir des mots de passe à jamais expiration, pour le moment de l'expiration, et ces les tâches peuvent être accomplies en utilisant Les drapeaux UserAccountControl qui sont démontré dans le cadre de l'instance section.
Veuillez vous référer à cette grande article MSDN: Gestion des mots de passe Utilisateur pour des exemples et de la documentation au sujet de ces caractéristiques.
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
Ce code va créer un compte local avec le mot de passe n'expire jamais option:
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();
}
j'ai passé beaucoup de temps à comprendre comment créer un compte d'utilisateur local avec le mot de passe réglé pour ne pas expirer. Il semble que, lorsque vous essayez d'utiliser:
int val = (int)newUser.Properties["userAccountControl"].Value;
newUser.Properties["userAccountControl"].Value = val | 0x10000
les permissions de active directory entrent en jeu. Si vous avez les permissions Active directory, tout fonctionne très bien. Si vous ne le faites pas alors obtenir le la propriété userAccountControl se traduira toujours par une valeur nulle. Essayer de définir userAccountControl aboutira à une exception "la Propriété directory ne peut pas être trouvée dans le cache".
cependant après beaucoup de chasse autour de moi j'ai trouvé une autre propriété "UserFlags" qui doit être réglée en utilisant Invoke. Vous pouvez l'utiliser pour placer le drapeau sur un compte local. J'ai essayé ce code et il a fonctionné sur Windows server 2008.
J'espère que cela aidera
utilisation du système.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();