2016-02-05 65 views
2

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

下都没有奏效:

前三每个给出确切的相同,高度神秘的错误消息,“约束冲突”与扩展消息:

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#accomplishable。

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

+0

我将C#代码复制并粘贴到控制台应用程序中,替换值并运行时没有任何问题。我的猜测是,有一些关于用户的意思是不应该设置标志。它们是否过期,或者它们是否启用了“用户必须在下次登录时更改密码”? – Ashigore

+0

@Ashigore我尝试过与各种用户没有成功。没有用户有任何特殊的标志,他们都启用,他们的密码没有过期(或有标志“用户必须在下次登录时更改密码”)。我对Active Directory不够了解,不知道哪些约束被违反,或者如何识别 - 或者为什么powershell方法有能力更改标志。 – Resorath

+0

我假设您的帐户或运行C#代码的任何帐户都有权更改AD中的用户? – Ashigore

回答

0

我有完全相同的问题,使用非常相似的C#代码。在我的情况下,我们用来设置“用户不能更改密码”标志的帐户有自己标记的选项。当我们从帐户中移除标志时,代码开始工作。

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