创建本地用户帐户 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的主要内容,如果未能解决你的问题,请参考以下文章

win10怎么创建本地用户管理员

如何使用 .NET C# 从登录屏幕中隐藏用户?

使用 c# 在本地注销 Windows 用户

C# ActiveDirectory - 如何将本地用户帐户从加入域的计算机远程添加到非域计算机

将凭据添加到与本地系统帐户不同的帐户

.NET Com 互操作帐户