所以我編寫一個程序在Go中,C綁定感謝CGo,並且我正在使用ldap執行搜索,添加和修改操作。我可以設法做到這一切,但現在即時嘗試在unicodePwd mod_type中設置密碼,我似乎無法解決錯誤53:服務器不願意執行。C/Go中的LDAP:錯誤代碼53「服務器不願意執行」試圖設置unicodePwd
我知道很多東西都可能導致這樣的錯誤: 我與ldaps連接。 我爲測試目的硬編碼了一個由10個字符組成的密碼,在開頭和結尾都帶有雙引號,並在UTF-16LE Base64中獲得了該密碼。 密碼hase小寫字母,大寫字母和標點符號。
下面是我的一些代碼樣本,即時通訊只是測試的東西,現在這樣的編碼是非常糟糕:
設置選項:C.ldap_set_option(l, LDAP_OPT_PROTOCOL_VERSION, unsafe.Pointer(&version)) C.ldap_set_option(l, LDAP_OPT_REFERRALS, unsafe.Pointer(&v))
初始化:C.ldap_initialize(&l, C.CString("ldaps://**.**.**.**:636"))
綁定:rc := C.ldap_simple_bind_s(l, C.CString("CN=Administrator,CN=Users,DC=intra,DC=localdomain,DC=com"), C.CString("**********"))
現在是重要的一部分,添加一個用戶密碼:
add_user(l, "ldaps://**.**.**.**", "636", "CN=Administrator,CN=Users,DC=intra,DC=localdomain,DC=com", "OU=*******,DC=intra,DC=localdomain,DC=com")
func add_user(l *C.LDAP, host string, port string, login string, container string) {
var mods [5]*C.LDAPModStr
var modClass, modCN, modSN, modPass C.LDAPModStr
var vclass [5]*C.char
var vcn [4]*C.char
var vsn [2]*C.char
var vpass [2]*C.char
modClass.mod_op = 0
modClass.mod_type = C.CString("objectclass")
vclass[0] = C.CString("top")
vclass[1] = C.CString("person")
vclass[2] = C.CString("organizationalPerson")
vclass[3] = C.CString("User")
vclass[4] = nil
modClass.mod_vals = &vclass[0]
modCN.mod_op = 0
modCN.mod_type = C.CString("cn")
vcn[0] = C.CString("john")
vcn[1] = nil
modCN.mod_vals = &vcn[0]
modSN.mod_op = 0
modSN.mod_type = C.CString("sn")
vsn[0] = C.CString("mclane")
vsn[1] = nil
modSN.mod_vals = &vsn[0]
modPass.mod_op = 0
modPass.mod_type = C.CString("unicodePwd")
vpass[0] = C.CString("IgBTAHcAZQBlAHQATgBlAHcAUAB3AGQAMQAyADMAIQAiAA==")
vpass[1] = nil
modPass.mod_vals = &vpass[0]
mods[0] = &modClass
mods[1] = &modCN
mods[2] = &modSN
mods[3] = &modPass
mods[4] = nil
dn := "cn=john,OU=*********,DC=intra,DC=localdomain,DC=com"
rc := C._ldap_add(l, C.CString(dn), &mods[0])
if rc != LDAP_SUCCESS {
er := C.ldap_err2string(rc)
fmt.Println("ADD ERROR")
fmt.Println(rc)
fmt.Println(C.GoString(er))
}
哦,繼承人的類型LDAPModStr的定義:
typedef struct ldapmod_str {
int mod_op;
char *mod_type;
char **mod_vals;} LDAPModStr;
而且_ldap_add:
int _ldap_add(LDAP *ld, char* dn, LDAPModStr **attrs){
return ldap_add_ext_s(ld, dn, (LDAPMod **)attrs, NULL, NULL);
}
我可能失去了一些東西很明顯這裏,因爲我還挺新的去LDAP,但如果你能幫我解決這個問題,我真的很感激。我不知道這是否相關,但程序連接到在虛擬機中的同一臺計算機上運行的Windows Server 2012 R2的Active Directory。另外我在這裏有點新,如果對你更容易,我可以在這裏發佈我的所有代碼,但我認爲只是發佈重要步驟可能會更好。
您應該傳遞明文密碼,並且如果您使用帶密碼策略擴展名的OpenLDAP,則應該使用modify-password擴展操作,而不僅僅是屬性更改。 – EJP
在我的代碼中使用非編碼密碼也不起作用。至於你的其他建議,你的意思是在shell命令中使用ldappasswd? – madraven
@madraven,不,這是一種特殊的操作(操作示例是「搜索」和「更新」),由某些LDAP服務器支持 - 請參見[RFC 3062](https://www.ietf.org/rfc/) rfc3062.txt)。 – kostix