我正在尝试使用ldap_modify函数修改AD属性值…
代码在下面…
LDAPMod *list_of_attrs[1]={0}; char *Password[] = {"Password2"}; LDAPMessage *result=NULL; int msgid; int rc=0; LDAPMod attribute2; attribute2.mod_type = (PCHAR)"Password number"; attribute2.mod_op = LDAP_MOD_REPLACE; attribute2.mod_vals.modv_strvals=Password; list_of_attrs[0] = &attribute2; wchar_t dnName[100]={0}; char *dn = "CN=test,CN=Users,DC=raja,DC=com"; mbstowcs(dnName,dn, 100); PWCHAR dnNameval = (PWCHAR)malloc(sizeof(PWCHAR) * 20); wcscpy(dnNameval,dnName); msgid=ldap_modify(pLdapConnection,(const PCHAR)dnNameval, list_of_attrs);
但是,当涉及到最后一行(msgid)访问冲突exception发生..
* 在AD2.exe 0x76f693ac未处理的exception:0xC0000005:访问冲突读取位置0xcccccccc。 *
请好心帮助我解决这个问题。
我可能从位置0xcccccccc中猜测由于未初始化的指针而发生崩溃。 读代码时, pLdapConnection
看起来就是那个指针。
更新
读完OP注释之后,现在我可以看到问题出现在第三个引用MSDN的参数中,这个引用是以null结尾的修改数组 。 因此,正确的用法应该是例如
LDAPMod attribute2; // Initialize attribute2 ............ LDAPMod *list_of_attrs[2]={&attribute2, 0};
也就是说,数组的大小应该比您想定义的条目数量多一个,最后一个数组项应该是NULL。
只要使用mod_values mod_vals …
mod_values是在winldap.h中定义的
char *Password[] = {"Password2",NUll}; attribute2.mod_type = (PCHAR)"Password number"; attribute2.mod_op = LDAP_MOD_REPLACE; attribute2.mod_values=Password; ldap_modify(pLdapConnection,dnNameval, list_of_attrs);
现在,ldap_modify函数可以正常工作并修改Active Directory中的属性值…
感谢您的支持
三居