2

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 を読み取るアクセス違反。*

それを解決するために親切に助けてください...事前に感謝します。

4

2 に答える 2

1

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 の属性に変更します...

ご協力ありがとうございました

三十

于 2012-10-22T09:02:16.320 に答える
1

場所 0xccccccccから、初期化されていないポインターが原因でクラッシュが発生したと推測できます。コードを読むと、pLdapConnectionそのポインターのように見えます。

アップデート

OP コメントを読んだ後、問題が 3 番目の引数にあることがわかりました。これは、MSDN を引用して、エントリに加える変更のヌル終了配列です。したがって、正しい使用法は次のようになります。

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

つまり、配列のサイズは、定義するエントリの数よりも 1 大きくする必要があり、最後の配列項目は NULL にする必要があります。

于 2012-10-15T08:23:28.103 に答える