如何使用.NET 2.0和c#创建本地用户帐户,并且还能够将"密码永不过期"设置为永不.
我尝试使用Process.Start使用"Net.exe"并传递其参数,但似乎"net user"无法将"Password never expires"设置为never.
阅读这篇优秀的CodeProject文章
Howto :(几乎)通过C#在Active Directory中的一切
有一个"创建用户帐户"和"处理用户密码"部分.
更新:
要使本地帐户的代码适应,请使用以下代码替换相应的行:
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName); DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");
这里启动域帐户的原始代码段:
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; }
在处理用户密码和密码边界时需要了解一些细节,例如强制用户在下次登录时更改密码,拒绝用户更改自己的密码,设置密码永不过期,何时过期,这些任务可以使用前面部分中演示的UserAccountControl标志来完成.
请参阅这篇精彩的 MSDN文章:管理用户密码 以获取有关这些功能的示例和文档.
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
此代码将创建一个本地帐户,密码永不过期选项集:
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(); }
0x10000标志表示PasswordNeverExpires.
我花了很长时间搞清楚如何创建一个密码设置不会过期的本地用户帐户.看来当你尝试使用时:
int val = (int)newUser.Properties["userAccountControl"].Value; newUser.Properties["userAccountControl"].Value = val | 0x10000
来自活动目录的权限发挥作用.如果您有活动的目录权限,一切正常.如果不这样,那么获取userAccountControl属性将始终导致null值.尝试设置userAccountControl将导致异常"无法在缓存中找到目录属性".
然而,经过多次狩猎后,我发现需要使用Invoke设置另一个属性"UserFlags".您可以使用它在本地帐户上设置标志.我试过这个代码,它在Windows Server 2008上运行.
希望这可以帮助