2012-07-26 126 views
0

我正在嘗試使用System.Web.Security API創建一個基於問題/回答重置密碼的Web應用程序。忘記密碼

我得到一個異常:

DirectoryServicesCOMException(0x8007202f):一個約束衝突 發生」,如果用戶提供一個不好回答的問題

如果我重置的attributeMapFailedPasswordAnswerCount值不設置該帳戶再次變爲活動狀態

AD中的帳戶鎖定閾值設置爲20次登錄嘗試

我是AD知識的新手,如果有人能指導我如何解決這個問題,將不勝感激。

謝謝。

+0

基於安全問題重置AD密碼的Web服務?聽起來像一個非常糟糕的主意......無論如何,沒有代碼的情況下,這種例外是無用的。如果您發佈拋出此異常的代碼,則更有可能有人可以幫助您。 – Ran 2012-07-26 21:22:04

+0

謝謝你給我關於潛在安全警告的建議。我計劃將它擴展到手機並在私人電子郵件上發送密碼重置。但現在我不得不提出這個網絡服務。 – user984201 2012-07-27 11:44:23

+0

問題是,當映射到attributeMapFailedPasswordAnswerCount這個字段的when屬性被設置爲異常時,所有具有AD功能都會拋出,包括登錄,更改密碼或更改安全問題/答案。 – user984201 2012-07-27 11:47:37

回答

1

我猜你正在使用ASP.NET?我沒有任何經驗,也沒有太多的.NET經驗(我仍然在學習自己),但這是一個非常有用的鏈接,提供了各種Active Directory API的示例(link)。包括重置用戶密碼。這是DirectoryEntry類的鏈接,如果您不確定如何設置它(link)。另外,只需瀏覽namespace documentation是非常非常有用的(link)。我喜歡微軟的唯一可能是他們的優秀文檔。

我平時做這樣的事情(在IronPython的,所以它不會直接轉化爲代碼,你可以使用):

ou = System.DirectoryServices.DirectoryEntry("LDAP://ou=Users,dc=whatever,dc=something,dc=localetc") 
search = System.DirectoryServices.DirectorySearcher(ou, "(samAccountName="+acc"+")", Array[str](["distinguishedName"]])) 
result = search.FindAll() # note 1 
if result.Count != 1: 
    raise BadError 
else: 
    ent = System.DirectoryServices.DirectoryEntry(result[0].Properties["distinguishedName"][0]) 
    ent.Username = admin # note 2 
    ent.Password = pwd 
    ent.Invoke("SetPassword", Array[object](["newpassword!"])) 
    ent.Properties["LockOutTime"].Value = 0 
    ent.CommitChanges() 

注:

  1. 如果這個不斷返回多個結果,你有問題。

  2. 只有在運行此帳戶的帳戶無權更改用戶時,才需要此密碼和密碼。我上unprivelaged帳戶運行這些,所以我必須在腳本中包含我的管理員憑據(別擔心,他們沒有硬編碼)

哦,你的帳戶鎖定閾值是相當高的。我建議3-5,取決於你的用戶的才能。

+0

接受,否認,但請不要忽視。 – Logan 2012-07-30 16:07:59

+0

謝謝,先生! :) – Logan 2012-07-30 16:28:59

+0

謝謝你幫我解答,我能弄清楚更多的細節。添加更多幫助我的東西。我用來映射到屬性的變量,其中一些是系統變量,無法使用。 希望這可能對某人有用。 我檢查的第二件事是我搜索了本地安全策略,並查看了帳戶策略和帳戶鎖定策略。它應該爲所有三個變量定義值。 無論如何,感謝您的幫助,並在答覆中付出如此多的努力,我真的很感激。 – user984201 2012-07-30 16:29:15