创建本地用户帐户 c# 和 .NET 2.0
Posted
技术标签:
【中文标题】创建本地用户帐户 c# 和 .NET 2.0【英文标题】:Creating local user account c# and .NET 2.0 【发布时间】:2010-09-27 21:52:38 【问题描述】:如何使用 .NET 2.0 和 c# 创建本地用户帐户,并且还能够将“密码永不过期”设置为永不。
我曾尝试使用 Process.Start 使用“Net.exe”并传递其参数,但似乎“网络用户”无法将“密码永不过期”设置为永不。
【问题讨论】:
【参考方案1】:阅读这篇优秀的 CodeProject 文章
Howto: (Almost) Everything In Active Directory via C#
有“创建用户帐户”和“处理用户密码”部分。
更新:
为了适应本地帐户的代码,将相应的行替换为:
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" +
Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");
这里开始域帐户的原始代码 sn-p:
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 article: Managing User Passwords 示例和文档 关于这些功能。
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
【讨论】:
您指定的链接用于活动目录。也许我不是很清楚。我想更改本地用户帐户(计算机不是活动目录的一部分)。 据我记得它也应该适用于本地帐户。 @Mohammadreza:我更新了我的答案。现在有处理本地帐户的代码【参考方案2】:此代码将创建一个设置了密码永不过期选项的本地帐户:
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 属性将始终产生空值。尝试设置 userAccountControl 会导致“缓存中找不到目录属性”异常。
然而,经过多次搜寻,我发现了另一个需要使用 Invoke 设置的属性“UserFlags”。您可以使用它在本地帐户上设置标志。我试过这段代码,它在 windows server 2008 上运行。
希望对你有帮助
【讨论】:
不错,+1。几点注意事项:首先,DirectoryEntry 是一次性的,所以最好用 using 包装;其次,如果您需要在远程机器上创建本地用户,DirectoryEntry 构造函数可以采用远程机器名称。【参考方案3】:使用 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();
【讨论】:
以上是关于创建本地用户帐户 c# 和 .NET 2.0的主要内容,如果未能解决你的问题,请参考以下文章