You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:35:36