【问题标题】:ldap_modify function through access violation?ldap_modify 函数通过访问冲突?
【发布时间】:2012-10-15 05:32:37
【问题描述】:

我正在尝试使用 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)发生访问冲突异常..

*AD2.exe 中 0x76f693ac 处的未处理异常:0xC0000005:访问冲突读取位置 0xcccccccc。*

请帮我解决这个问题... 提前致谢。

【问题讨论】:

  • 将宽字符串转换为窄字符串是个坏主意。
  • 很可能是演员:(const PCHAR)dnNameval.
  • 我不擅长有问题的LDAP函数,但除了混合使用或charwchar_t之外,函数如何知道数组list_of_attrsPassword的长度是?
  • 现在我唯一的问题是 list_of_attrs attribute2.mod_type = (PCHAR)"Password number";属性 2.mod_op = LDAP_MOD_REPLACE; attribute2.mod_vals.modv_strvals=密码; list_of_attrs[0] = &attribute2;我怎么能将值传递给这个参数......主要是attribute2.mod_vals......

标签: c++ c windows


【解决方案1】:

我可能从 location 0xcccccccc 猜测崩溃是由于未初始化的指针造成的。阅读代码时,pLdapConnection 似乎就是那个指针。

更新

阅读 OP 注释后,现在我可以看到问题出在第三个参数中,即引用 MSDN,要对条目进行的以 null 结尾的修改数组。 因此,正确的用法应该是例如

LDAPMod attribute2;     
// Initialize attribute2
............
LDAPMod *list_of_attrs[2]={&attribute2, 0};

也就是说,数组的大小应该比您要定义的条目数大一并且最后一个数组项应该为 NULL。

【讨论】:

  • 安德烈,我确实检查了 ldap_modify 函数中的 3 个参数,设置为 null,之后,为每个参数赋值,只有第 3 个给出异常......所以我肯定说“属性列表”唯一的问题...如何将值传递给第三个参数,尤其是 attrib.mod_vals...
  • 我在 attrib.mod_vals 中有一个问题......因为它有一个结构......那个结构有一个联合......结构是 typedef struct ldapmodA { ULONG mod_op; PCHAR mod_type;联合 { PCHAR *modv_strvals;结构 berval **modv_bvals; } mod_vals; LDAPModA, *PLDAPModA;...现在任何人都可以知道如何传递 attrib.mod_vals?
【解决方案2】:

只使用 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 中的属性值...

感谢您的支持

三重

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2019-11-21
    • 2013-11-20
    相关资源
    最近更新 更多