2
我尝试了多种方法来设置标志“用户无法更改密码”在活动目录从C#。当试图设置“用户无法更改密码”在活动目录从c#
下都没有奏效:
- 设置“CannotChangePassword”为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#accomplishable。
这是域问题,代码运行环境还是代码本身?
我将C#代码复制并粘贴到控制台应用程序中,替换值并运行时没有任何问题。我的猜测是,有一些关于用户的意思是不应该设置标志。它们是否过期,或者它们是否启用了“用户必须在下次登录时更改密码”? – Ashigore
@Ashigore我尝试过与各种用户没有成功。没有用户有任何特殊的标志,他们都启用,他们的密码没有过期(或有标志“用户必须在下次登录时更改密码”)。我对Active Directory不够了解,不知道哪些约束被违反,或者如何识别 - 或者为什么powershell方法有能力更改标志。 – Resorath
我假设您的帐户或运行C#代码的任何帐户都有权更改AD中的用户? – Ashigore