2010-11-18 19 views
1

Şu anda belirli bir kullanıcının memberOf özniteliğini almak için C++ 'da bir LDAP sorgusu gerçekleştirmeye çalışıyorum. Sadece bir grupta olsaydı, özniteliği başarılı bir şekilde alan bir işlev var. Sorun şu ki, birden fazla grupta olduklarında sadece ilkini döndürüyorlar. Kullanıcıya Active Directory tarayıcısında baktığımda, onun MemberOf için 2 girdisi olduğunu söylediğini, ancak işlevimi kullandığımda yalnızca ilkini aldığımı görebiliyorum. Tüm girdileri geri çekmek için işlevimi değiştirmenin bir yolu var mı, yoksa tamamen yanlış yolda mıyım?C++ LDAP Sorgulamak için üyeOfile

bool FindADMembership(CStringArray* pUserArray,IDirectorySearch *pContainerToSearch, CString sAMAccountName){ 

if(pContainerToSearch==NULL||pUserArray==NULL) 
    return false; 

CString strSearchFilter; 
strSearchFilter.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName=%s))", sAMAccountName); 
BSTR b = strSearchFilter.AllocSysString(); 
LPOLESTR pszSearchFilter = b; 
ADS_SEARCHPREF_INFO SearchPrefs; 
SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; 
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER; 
SearchPrefs.vValue.Integer = ADS_SCOPE_SUBTREE; 
DWORD dwNumPrefs = 1; 

LPOLESTR pszColumn = NULL;  
ADS_SEARCH_COLUMN col; 
HRESULT hr; 

IADs *pObj = NULL; 
IADs * pIADs = NULL; 

ADS_SEARCH_HANDLE hSearch = NULL; 
hr = pContainerToSearch->SetSearchPreference(&SearchPrefs, dwNumPrefs); 
if (FAILED(hr)) 
    return false; 


LPOLESTR pszNonVerboseList[] = {L"memberOf"}; 
LPOLESTR szName = new OLECHAR[MAX_PATH]; 
int iCount = 0; 


hr = pContainerToSearch->ExecuteSearch(pszSearchFilter, pszNonVerboseList,sizeof(pszNonVerboseList)/sizeof(LPOLESTR),&hSearch); 
if (SUCCEEDED(hr)) 
{  
    hr = pContainerToSearch->GetFirstRow(hSearch); 
    if (SUCCEEDED(hr)) 
    { 
     while(hr != S_ADS_NOMORE_ROWS) 
     { 
      iCount++; 
      while(pContainerToSearch->GetNextColumnName(hSearch, &pszColumn) != S_ADS_NOMORE_COLUMNS) 
      { 
       hr = pContainerToSearch->GetColumn(hSearch, pszColumn, &col); 
       if (SUCCEEDED(hr)) 
       { 
        if (0==wcscmp(L"memberOf", pszColumn)) 
        { 
         wcscpy(szName,col.pADsValues->CaseIgnoreString); 
         pUserArray->Add(szName); 
        } 

        pContainerToSearch->FreeColumn(&col); 
       } 
       FreeADsMem(pszColumn); 
      } 


      hr = pContainerToSearch->GetNextRow(hSearch); 
     } 

    } 
    else 
     return false; 

    pContainerToSearch->CloseSearchHandle(hSearch); 
} 
else 
    return false; 

return true; } 

Düzenleme:

bu burada çalıştıktan sonra sonuçları yinelemenize kodudur

Sen sırayla her almak için üzerlerinden değerlerinin sayısını ve döngü kontrol etmeliyiz
if (0==wcscmp(L"memberOf", pszColumn)) { 
    for(int i = 0; i < col.dwNumValues; i++) 
    { 
     wcscpy(szName, col.pADsValues[i].CaseIgnoreString); 
     pUserArray->Add(szName); 
    } 
} 

cevap

1

- pADSValues,> 1 dizgi içerebilen bir dizidir. Sayım dwNumValues'da döndürülür.

if (0==wcscmp(L"memberOf", pszColumn)) 
{ 
    // This code should actually be a loop for i = 0 to dwNumValues - 1 
    // with each loop checking the next array entry in the list pADsValues 
    wcscpy(szName,col.pADsValues->CaseIgnoreString); 
    pUserArray->Add(szName); 
} 

Bkz. Belgeler here.