2016-02-05 63 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。