我目前正在尝试在c++中执行LDAP查询以获取给定用户的memberOf属性。我编写了一个函数,如果它们仅在一组中,则可以成功获取属性。问题在于,当它们在多个组中时,它仅返回第一个。当我在Active Directory浏览器中查看用户时,我可以看到它说他们有2个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);
}
}
最佳答案
您需要检查值的数量并遍历它们以依次获取每个值-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。
关于c++ - C++ LDAP查询以找到memberOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4220862/