2010-11-18 43 views
1

現在、特定のユーザーのmemberOf属性を取得するために、C++でLDAPクエリを実行しようとしています。彼らは1つのグループにのみ存在する場合、私は正常に属性を取得する関数を書かれている。問題は、複数のグループに所属している場合、最初のグループのみを返すことです。 Active Directoryブラウザでユーザーを見ると、memberOfの2つのエントリがあることがわかりますが、私の関数を使用すると最初のものしか取得できません。すべてのエントリを取り戻すために私の関数を変更する方法はありますか、間違ったパスに完全に私はありますか?C++ LDAP memberOfの検索クエリ

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; } 

編集:ここでは、この作業を終えた後

あなたは順番にそれぞれを得るためにそれらの上に値の数とループをチェックする必要が結果

if (0==wcscmp(L"memberOf", pszColumn)) { 
    for(int i = 0; i < col.dwNumValues; i++) 
    { 
     wcscpy(szName, col.pADsValues[i].CaseIgnoreString); 
     pUserArray->Add(szName); 
    } 
} 

答えて

1

を反復処理するためのコードです - pADSValuesは、> 1文字列を含む可能性のある配列です。カウントはdwNumValuesに返されます。

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); 
} 

docs hereを参照してください。