2012-04-03 92 views
5

我目前嘗試通過Linux在LDAP上更改我們的Active Directory Envoirenment中的密碼,因爲有問題的用戶無法訪問Windows計算機,我們希望保持這種方式。 爲了更改密碼,我目前不知道如何使用ldapmodify來做到這一點。大量的閱讀不同網站/論壇/新聞組後,我比以前通過ldapmodify在AD中更改密碼時的LDAP約束違規

但是更加困惑: 我嘗試使用以下命令這樣做:

ldapmodify -f ldif.example -H ldaps://lab01-dc01.example.com -D 'CN=test,CN=users,DC=lab01,DC=example,DC=com' -x -W 

的ldif.example的內容:

dn: CN=test,CN=Users,DC=lab01,DC=example,DC=com 
changetype: modify 
delete: unicodePwd 
unicodePwd:: V3VQdXV1STEyLg== 
- 
add: unicodePwd 
unicodePwd:: QmxhVVVraTEyLg== 
- 

(不要擔心 - 這些密碼不會被任何地方使用,它不是一個生產envoirenment)

現在 - 每次我執行我收到以下錯誤的命令:

modifying entry CN=test,CN=Users,DC=lab01,DC=example,DC=com" 
ldapmodify: Constraint violation (19) 
additional info: 0000216C: AtrErr: DSID-03190EB0, #1: 
0: 0000216C: DSID-03190EB0, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 9005a (unicodePwd) 

現在,經過我讀此錯誤的原因是要麼密碼格式錯誤或密碼策略不允許我使用的密碼。我檢查了這個政策 - 現在多次 - 新密碼通過所有標準定義符合政策。如果我使用Windows機器設置密碼,它也可以很好地工作(當然,之後我更改了「oldpassword」和「newpassword」,因爲策略不允許我更改爲較早的密碼)。在將「-W」選項傳遞給ldapmodify後輸入的密碼也是正確的,否則ldapmodify吐出的錯誤是我使用無效憑證而不是違反約束條件。 所以 - 我能想到的唯一原因實際上是格式不正確的密碼 - 但我無法弄清楚格式不好應該來自哪裏,因爲我使用普通的base64 algorythm來編碼密碼。

有沒有人知道發生了什麼事? 任何人都可以把我推向正確的方向嗎?

幫助非常感謝,我提前感謝您。

編輯: 誤會我的東西: 當我通過base64運行基本編碼的字符串時,它一直告訴我「無效輸入」。現在 - 我繼續前進,只是在linux機器上使用base64重新編碼密碼 - 但是當我再次通過解碼函數運行生成的字符串時,base64一直告訴我「Invalid Input」無效在windows-base64編碼的字符串和linux編碼的字符串之間改變。但base64只是說「輸入無效」,不管我放在那裏。

編輯2: Nevermind - 閱讀函數的目的我收集它會拋出此錯誤,因爲密碼中的圓點和感嘆號。

+0

我不確定你應該做任何編碼。 LDAP服務器應該這樣做。嘗試以純文本提供這兩個密碼。 – EJP 2012-04-04 01:39:57

+0

是的,確實如果沒有編碼密碼它似乎工作正常。就像我說的:我讀了很多關於這個主題的內容,並且我讀到的所有內容都表明我需要使用編碼的字符串來修改密碼。顯然 - 這不是真的。謝謝! – henryford 2012-04-04 07:58:47

回答

3

設置密碼時,需要使用UTF-16LE和Base64編碼。在Java中,它可以用做:

String source = "\"car\""; 
String utf16base64 = new String(Base64.getEncoder().encode(source.getBytes("UTF-16LE"))); 

UTF-16 LE已被使用,UTF-16是不夠的。

通過LDAP更改'unicodePwd'要求新密碼是帶雙引號的Unicode字符串。這意味着當你想要設置一個新密碼(Password01!)時,用雙引號(「Password01!」)將密碼轉換爲Base64。

可以使用在線工具 - http://www5.rptea.com/base64/(選擇UTF-16)。

關於unicodePwd的詳情有 - https://technet.microsoft.com/en-us/magazine/ff848710.aspx

1

如何從其他用戶獲取正在存在的工作密碼並嘗試將其包含在您的ldif中?

這樣你就可以確定你的密碼正在工作。

二,不要在ldif中使用delete/add使用replace。也許刪除會導致objectclass違規錯誤。

第三,如果只包含不可打印或特殊字符的屬性,則只需對base64進行編碼。在ldif文件的末尾有一個空行。

dn: CN=test,CN=Users,DC=lab01,DC=example,DC=com 
changetype: modify 
replace: unicodePwd 
unicodePwd: BlaUUki12. 

問候,

+0

感謝您的回答 - 替換確實工作正常,但問題是我必須使用管理綁定才能使用替換功能。但是,這可能是好的,我只會創建另一個帳戶。因爲我在技術上用smbpasswd而不是LDAP來解決它,所以我不再需要它了 - 但是我現在正在挖掘LDAP,所以我會這樣做。再次感謝! – henryford 2012-04-04 07:56:17

+1

這是一個老問題,但替換隻適用於管理員而不是用戶 – Kevin 2012-05-24 14:29:58

+0

如上所述,替換不適用於用戶替換自己的密碼。這不應該被接受的答案。 – 2015-03-06 23:39:49

3

以供將來參考,如果有人遇到similiar問題: 簡單的解決方案?只需使用smbpasswd而不是ldap來更改密碼 - 完美無瑕!我真的grumped,我沒想到之前的它: - d

但是使用(使用CentOS的)桑巴舞在Active Directory中更改密碼的方式:

~#yum install samba 
~#smbpasswd -r domaincontroller.example.com -U testuser1 
Old SMB password: 
New SMB password: 
Retype new SMB password: 
Password changed for user testuser1 on domaincontroller.example.com 

然後你就可以登錄使用新密碼。這很簡單,真的。

1

yum install samba對我不起作用,因爲它從samba 3.6.9版本安裝了smbpasswd程序。

工作原理是yum install samba4-client。這會爲Samba 4安裝smbpasswd程序,並且此版本的smbpasswd actualy可以在Windows Server 2008 R2域控制器上更改密碼。我使用samba4-client,因爲我不需要Samba服務器,只需要客戶端實用程序。

爲smbpasswd命令的語法是一樣的:

smbpasswd -r domaincontroller.example.com -U testuser1  

希望這有助於。

1

約束錯誤可能意味着您使用的舊密碼不符合策略,例如不能使用最後的24個密碼。 對於將來的參考: 連接到AD服務器(綁定): 1.作爲管理員:你可以更改和重置每個人的密碼。更改和重置之間有區別。更改= AD將執行密碼策略。重置=不。 2.作爲用戶:您可以更改密碼,但不允許重置密碼。更改= AD將執行密碼策略。 希望它有幫助,雖然有點晚!