尝试从 c# 在活动目录中设置“用户无法更改密码”时违反约束

本文关键字:密码 约束 用户 活动 设置 | 更新日期: 2023-09-27 18:33:34

我已经尝试了多种方法来从 c# 在活动目录中设置标志"用户无法更改密码"。

以下方法不起作用:

  • 在用户主体对象上将"不能更改密码"设置为 true
  • 在目录条目上的用户对象安全性上设置访问规则 (http://urslisworld.blogspot.ca/2010/02/set-user-cannot-change-password-in-c.html(
  • 直接设置 ntSecurityDescriptor (http://sourcefield.blogspot.ca/2009/12/cactivedirectory-check-user-cannot.html(
  • 当然,我不能根据 https://support.microsoft.com/en-us/kb/305144 直接设置用户帐户控制属性

前三个都给出完全相同的、高度隐晦的错误消息,"约束冲突"和扩展消息:

0000051B: AtrErr: DSID-030F20BA, #1:
0: 0000051B: DSID-030F20BA, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 20119 (nTSecurityDescriptor)

以下是应该有效的最简单的案例代码(选项 1(:

using (var context = new PrincipalContext(ContextType.Domain, myDomain, myAccountOperatorUsername, myAccountOperatorPassword))
{
    using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userNameToChange))
    {
        if (user != null)
        {
            user.UserCannotChangePassword = true;
            user.Save()
        }
    }
}

执行此操作的powershell方法工作得很好,使用来自同一台机器的相同凭据。事实上,它运行得非常好,我可以在代码中自动化它并且成功了:

using (var PowerShellInstance = PowerShell.Create())
{
    PowerShellInstance.AddScript("Import-Module Active-Directory");
    PowerShellInstance.AddScript("$password = ConvertTo-SecureString '"" + myAccountOperatorPassword + "'" -AsPlainText -Force");
    PowerShellInstance.AddScript("$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist '"" + myAccountOperatorUsername + "'", $password");
    PowerShellInstance.AddScript("Set-ADAccountControl -Identity " + usernameToChange + " -CannotChangePassword $true -Credential $cred");
    var PSOutput = PowerShellInstance.Invoke();
}

但是,Powershell 方式使部署更加复杂,这些部署应该在纯 c# 中完成。

这是域、代码运行环境还是代码本身的问题?

尝试从 c# 在活动目录中设置“用户无法更改密码”时违反约束

我在使用非常相似的 C# 代码时遇到了完全相同的问题。就我而言,我们用于设置"用户无法更改密码"标志的帐户已标记了该选项。当我们从帐户中删除标志时,代码开始工作。

显然,这只影响了 C#。该解决方案的其他实现工作正常,包括PowerShell。