2012-10-15 63 views
2

我試圖使用ldap_modify功能來修改AD屬性值...ldap_modify函數通過訪問衝突?

的代碼如下...

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。 *

請幫我解決這個問題... 在此先感謝。

+0

將一個寬字符串投射到一個狹窄的字符串是一個壞主意。 – chris

+0

任何人都可以嗎?!?!?! –

+1

它很可能是演員:'(const PCHAR)dnNameval'。 – chris

回答

1

我可能從位置0xcccccccc猜測由於未初始化的指針而發生崩潰。讀取代碼時,pLdapConnection看起來就是那個指針。

更新

閱讀OP意見後,現在我可以看到,問題是出在這是,報價MSDN,修改的空終止陣列,使該條目的第三個參數。 因此,正確的用法應該是例如

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

也就是說,數組的大小應該比條目的數量多了一個你想定義和最後一個數組項應爲NULL。

+0

Andrey,我沒有在ldap_modify函數中檢查3個參數,設置爲null,之後,給每個參數賦值,只有第三個參數給出例外...所以我一定說「attrib列表」唯一的問題......如何將值傳遞給第三個參數,尤其是attrib.mod_vals ... –

+0

@SanjuMonu:請看看更新後的答案 – Andrey

+0

感謝你的答案安德烈,但同樣的例外發生... –

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中的屬性。 ..

感謝您的支持

三居