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

时间:2016-02-05 18:38:00

标签: c# active-directory

我尝试了多种方法在c#的活动目录中设置“用户无法更改密码”标志。

以下没有奏效:

前三个用扩展消息给出完全相同的,高度神秘的错误消息“Constraint Violation”:

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#中应该可以实现。

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

1 个答案:

答案 0 :(得分:1)

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

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