我尝试了多种方法在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#中应该可以实现。
这是域,运行代码的环境还是代码本身的问题?
答案 0 :(得分:1)
使用非常相似的C#代码我遇到了完全相同的问题。就我而言,我们用来设置"用户的帐户无法更改密码"旗帜有这个选项标记自己。当我们从帐户中删除该标志时,代码开始工作。
这显然只会影响C#。该解决方案的其他实现工作正常,包括PowerShell。