Win32 ADSI C++ GetInfoEx API无法获取AD用户mail属性问题求助
解决ADSI C++ GetInfoEx获取mail属性返回0x8000500D的问题
你的问题核心是用错了ADSI提供者:WinNT:// 提供者是为本地机器、工作组或NT4域设计的,它不支持Active Directory原生的mail属性(这是LDAP协议下的AD专属属性)。下面是具体的解决方法和代码修改方案:
1. 切换到LDAP提供者绑定AD用户对象
要访问AD的用户属性,必须使用LDAP://路径来绑定用户。常见的LDAP路径格式有两种:
- 基于DN(区分名)的路径:比如
LDAP://CN=ausername,OU=Users,DC=adomainname,DC=com(需要知道用户的完整DN,可通过ADUC工具查看) - 基于UPN(用户主体名)的全局目录路径:比如
LDAP://<GC>/userPrincipalName=ausername@adomainname.com(全局目录可以简化查找,无需知道用户的组织单元位置)
修改你的ADsGetObject调用,替换为LDAP路径:
// 示例:使用DN路径(根据你的AD实际结构调整) hr = ADsGetObject(L"LDAP://CN=ausername,OU=Users,DC=adomainname,DC=com", IID_IADs, (void**)&pUsr);
2. 验证AD用户确实配置了mail属性
错误码E_ADS_PROPERTY_NOT_FOUND也可能是因为该用户在AD中根本没有设置mail属性:
- 打开Active Directory用户和计算机,找到目标用户,查看“属性”→“常规”标签下的“电子邮件”字段是否有值。
- 如果为空,先给用户配置邮箱属性,再尝试调用API。
3. 调整GetInfoEx的调用(或直接使用GetInfo)
使用LDAP提供者后,你可以继续用GetInfoEx指定获取mail属性,也可以直接调用GetInfo()获取用户的所有属性(更简洁)。下面是修改后的完整代码示例:
HRESULT hr = CoInitialize(NULL); if (hr == S_OK || hr == S_FALSE) { IADs *pUsr = NULL; // 使用LDAP路径绑定AD用户(替换为你的实际路径) hr = ADsGetObject(L"LDAP://CN=ausername,OU=Users,DC=adomainname,DC=com", IID_IADs, (void**)&pUsr); if (SUCCEEDED(hr)) { VARIANT var; VariantInit(&var); // 方法1:使用GetInfoEx指定获取mail属性 LPWSTR pszAttrs[] = { L"mail" }; DWORD dwNumber = sizeof(pszAttrs) / sizeof(LPWSTR); HRESULT hrAry = ADsBuildVarArrayStr(pszAttrs, dwNumber, &var); hr = pUsr->GetInfoEx(var, 0); VariantClear(&var); // 方法2:直接调用GetInfo获取所有属性(更简洁,无需指定属性列表) // hr = pUsr->GetInfo(); if (SUCCEEDED(hr)) { hr = pUsr->Get(CComBSTR("mail"), &var); if (SUCCEEDED(hr)) { printf("mail: %S\n", V_BSTR(&var)); VariantClear(&var); } else { printf("Failed to get mail attribute, hr: 0x%X\n", hr); } } else { printf("GetInfoEx failed, hr: 0x%X\n", hr); } if (pUsr) pUsr->Release(); } else { printf("ADsGetObject failed, hr: 0x%X\n", hr); } CoUninitialize(); }
4. 检查运行权限
确保运行程序的账号具有读取AD用户属性的权限:
- 默认域用户账号通常具备读取权限,但如果是本地系统账号或非域账号,可能会被AD拒绝访问。
- 可以尝试用域管理员账号运行程序,验证是否是权限问题导致的失败。
内容的提问来源于stack exchange,提问作者OneUp
相关产品推荐
相关产品推荐

