【问题标题】:Creating local user account c# and .NET 2.0创建本地用户帐户 c# 和 .NET 2.0
【发布时间】:2010-09-27 21:52:38
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net account


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多