2015-10-13 20 views
0

所以我編寫一個程序在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。另外我在這裏有點新,如果對你更容易,我可以在這裏發佈我的所有代碼,但我認爲只是發佈重要步驟可能會更好。

+2

您應該傳遞明文密碼,並且如果您使用帶密碼策略擴展名的OpenLDAP,則應該使用modify-password擴展操作,而不僅僅是屬性更改。 – EJP

+0

在我的代碼中使用非編碼密碼也不起作用。至於你的其他建議,你的意思是在shell命令中使用ldappasswd? – madraven

+1

@madraven,不,這是一種特殊的操作(操作示例是「搜索」和「更新」),由某些LDAP服務器支持 - 請參見[RFC 3062](https://www.ietf.org/rfc/) rfc3062.txt)。 – kostix

回答

1

我不知道是否有人會感興趣,但我找到了@ kostix的幫助下的解決方案,我想我會分享:C中的擴展修改操作(使用CGO)不起作用,但是使用正確的編碼使用go-ldap進行簡單的修改操作可以讓我在Windows AD上更改用戶密碼。

相關問題