创建本地用户帐户c#和.NET 2.0
如何使用.NET 2.0和c#创建本地用户帐户,并且能够将“密码永不过期”设置为永远不会。创建本地用户帐户c#和.NET 2.0
我已经尝试使用“Net.exe”使用Process.Start并传递其参数,但似乎“网络用户”无法将“密码永不过期”设置为永远不会。
阅读这个优秀CodeProject上的文章
Howto: (Almost) Everything In Active Directory via C#
有一节“创建用户帐户”和“与用户密码交易”。
UPDATE:
为了适应代码为本地帐户替换相应的线路与这些:
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;
}
有一些细节与用户密码各地密码处理和 边界时如 强制用户在下次登录时更改他们的 密码了解 ,否认 用户更改自己的 密码的权利,设置密码永不 到期,何时到期,并且这些 任务可以使用 用户帐户控制标志 在前面的 节中演示。
请参考这个伟大 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
此代码将创建一个本地帐户永不过期选项设置的密码:
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();
}
的0x10000的标志意味着PasswordNeverExpires。
我花了很长时间了解如何创建一个本地用户帐户,密码设置为不过期。看起来,当你尝试使用:
int val = (int)newUser.Properties["userAccountControl"].Value;
newUser.Properties["userAccountControl"].Value = val | 0x10000
来自活动目录的权限发挥作用。如果你有活动目录权限,一切正常。如果你不这样做,那么获取userAccountControl属性将始终导致一个空值。尝试设置userAccountControl将导致一个异常“无法在缓存中找到目录属性”。
但是,经过多次寻找后,我发现需要使用Invoke设置另一个属性“UserFlags”。您可以使用它在本地帐户上设置标志。我试过这段代码,它在Windows Server 2008上工作。
希望这有助于
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();
您指定的链接用于活动目录。也许我不清楚。我想更改本地用户帐户(该计算机不是活动目录的一部分)。 – mrtaikandi 2008-12-21 10:11:53
据我记得,它也应该适用于本地帐户。 – splattne 2008-12-22 13:48:39