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