Active Directory用户直接下属查询仅返回首个结果的问题求助
解决Active Directory用户直接下属仅返回首个结果的问题
你的代码只返回第一个下属的核心原因是:directReports是Active Directory中的多值属性,而当前代码仅读取了该属性的第一个值,没有遍历所有属性条目。
问题代码的核心缺陷
在GetColumn获取到ADS_SEARCH_COLUMN后,你直接访问了col.pADsValues->CaseIgnoreString,但多值属性的pADsValues是一个数组,需要通过col.dwNumValues获取总数量,再循环遍历所有元素。
修改后的完整代码
void getDirectReports(LPCWSTR pwszAccountName) { HRESULT hr; hr = CoInitialize(NULL); if (FAILED(hr)) { return; } IDirectorySearch* pdSearch = NULL; ADS_SEARCH_COLUMN col; CComBSTR path = L"LDAP://WIN-F94H2MP3UJR.Test.local/CN="; path += pwszAccountName; path += L",CN=Users,DC=Test,DC=local"; hr = ADsOpenObject(path, L"Administrator", L"Password", ADS_SECURE_AUTHENTICATION, IID_IDirectorySearch, (void**)&pdSearch); if (SUCCEEDED(hr)) { LPWSTR directReports = convert(L"directReports"); LPWSTR pszAttr[] = { directReports }; ADS_SEARCH_HANDLE hSearch; DWORD nameSize = sizeof(pszAttr) / sizeof(LPWSTR); LPWSTR filter = convert(L"(&(objectClass=user))"); // 避免与路径变量重名 hr = pdSearch->ExecuteSearch(filter, pszAttr, nameSize, &hSearch); if (SUCCEEDED(hr)) { while (pdSearch->GetNextRow(hSearch) != S_ADS_NOMORE_ROWS) { hr = pdSearch->GetColumn(hSearch, directReports, &col); if (SUCCEEDED(hr)) { // 遍历所有多值属性条目 for (DWORD i = 0; i < col.dwNumValues; i++) { printf("%S\n", col.pADsValues[i].CaseIgnoreString); } // 释放列资源,避免内存泄漏 pdSearch->FreeColumn(&col); } } // 关闭搜索句柄 pdSearch->CloseSearchHandle(hSearch); } // 释放DirectorySearch对象 pdSearch->Release(); } CoUninitialize(); }
关键修改点说明
- 遍历多值属性:通过
col.dwNumValues获取下属总数,循环访问col.pADsValues[i]输出所有条目。 - 资源释放:添加
pdSearch->FreeColumn(&col)释放列资源,CloseSearchHandle关闭搜索句柄,Release释放DirectorySearch对象,避免内存泄漏。 - 变量名优化:将原
path变量名改为filter,避免和前面的AD路径变量重名,提升代码可读性。 - 初始化错误处理:添加
CoInitialize的返回值检查,确保COM初始化成功。
内容的提问来源于stack exchange,提问作者ironmanAJ
相关产品推荐
相关产品推荐

