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