You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#程序创建Windows本地用户时启用‘下次登录需改密码’

问题:创建本地Windows用户时启用“下次登录必须更改密码”选项

我正在开发一款Windows系统下的简易工具,用来创建本地用户账户并将其添加到管理员组或来宾组。目前用C# Windows窗体应用编写的代码可以创建账户并设置默认密码Pass@123,但无法启用**“下次登录必须更改密码”**选项。我曾尝试使用NewUser.Properties["pwdLastSet"].Value = 0;,但这个方法仅适用于ActiveDirectory,运行时抛出了异常,希望能得到解决。

现有代码如下:

try
{
  DirectoryEntry AD = new DirectoryEntry("WinNT://" +
  Environment.MachineName + ",computer");
  DirectoryEntry NewUser = AD.Children.Add(UserID, "user");
  NewUser.Invoke("SetPassword", new object[] { "Pass@123" });
  NewUser.Invoke("Put", new object[] { "Description", "A user account managed by system"});
  NewUser.Invoke("Put", new object[] { "FullName", "Work From Home: " + UserID });

  NewUser.CommitChanges();
  DirectoryEntry grp;

  grp = AD.Children.Find(AccountType, "group");

  if (grp != null) { grp.Invoke("Add", new object[] { NewUser.Path.ToString() }); }
     MessageBox.Show("Account Created Successfully","Successfull", MessageBoxButtons.OK, 
     MessageBoxIcon.Information);
                        
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        
}

解决方案

针对WinNT本地用户管理,不能使用ActiveDirectory的pwdLastSet属性,需要通过设置用户的userFlags属性来启用“下次登录必须更改密码”。对应的标志位是UF_PASSWORD_EXPIRED(十六进制值0x800000),这个标志会强制用户在下次登录时修改密码。

修改后的代码

try
{
    // 定义密码过期标志常量
    const int UF_PASSWORD_EXPIRED = 0x800000;

    DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
    DirectoryEntry NewUser = AD.Children.Add(UserID, "user");
    
    NewUser.Invoke("SetPassword", new object[] { "Pass@123" });
    NewUser.Invoke("Put", new object[] { "Description", "A user account managed by system" });
    NewUser.Invoke("Put", new object[] { "FullName", "Work From Home: " + UserID });
    
    // 设置下次登录必须改密码的标志
    NewUser.Invoke("Put", new object[] { "userFlags", UF_PASSWORD_EXPIRED });
    
    NewUser.CommitChanges();
    
    DirectoryEntry grp = AD.Children.Find(AccountType, "group");
    if (grp != null) 
    { 
        grp.Invoke("Add", new object[] { NewUser.Path.ToString() }); 
    }
    
    MessageBox.Show("Account Created Successfully", "Successfull", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

说明

  • 必须在调用CommitChanges()之前设置userFlags属性,确保修改被提交到系统。
  • UF_PASSWORD_EXPIRED标志会触发系统强制用户首次登录时修改密码,完全符合“下次登录必须更改密码”的需求。

内容的提问来源于stack exchange,提问作者Kanishka Kularathna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:35:22