2008-12-21 88 views
19

如何使用.NET 2.0和c#创建本地用户帐户,并且能够将“密码永不过期”设置为永远不会。创建本地用户帐户c#和.NET 2.0

我已经尝试使用“Net.exe”使用Process.Start并传递其参数,但似乎“网络用户”无法将“密码永不过期”设置为永远不会。

回答

21

阅读这个优秀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 
+0

您指定的链接用于活动目录。也许我不清楚。我想更改本地用户帐户(该计算机不是活动目录的一部分)。 – mrtaikandi 2008-12-21 10:11:53

+0

据我记得,它也应该适用于本地帐户。 – splattne 2008-12-22 13:48:39

21

此代码将创建一个本地帐户永不过期选项设置的密码:

 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上工作。

希望这有助于

0

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();