所以我在Go编写程序,感谢CGo使用C绑定,我正在使用ldap来执行搜索,添加和修改操作。我可以设法做到这一切,但现在我试图在unicodePwd mod_type中设置密码,我似乎无法绕过错误53:服务器不愿意执行。
我知道很多东西会导致这个错误: 我和ldaps有联系。 我为测试目的硬编码了一个由10个字符组成的密码,在开头和结尾都有双引号,并在UTF-16LE,Base64中得到了它。 密码包括小写字母,大写字母和标点符号。
以下是我的代码的一些示例,我现在正在测试内容,因此编码非常糟糕:
设置选项: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);
}
我可能在这里遗漏了一些明显的东西,因为我是GO和LDAP的新手,但如果你能帮我解决这个问题,我真的很感激。我不知道这是否相关,但程序连接到Windows Server 2012 R2的Active Directory,它运行在虚拟机中的同一台计算机上。另外我在这里有点新意,我可以在这里发布我的所有代码,如果它对你来说更容易,但我认为发布重要步骤可能更好。
答案 0 :(得分:1)
我不知道是否有人会感兴趣但是我在@kostix的帮助下找到了一个解决方案,而且我认为我分享了:C中的扩展修改操作(使用CGO)没有'但是,使用带有正确编码的go-ldap的简单修改操作允许我在Windows AD上更改用户密码。