ADSI GetInfoEx 不检索邮件属性

ADSI GetInfoEx not retrieving mail attribute

我无法使用 Win32 ADSI c++ GetInfoEx API 来检索 AD 用户的邮件属性。 Get 调用改为 returns hr 0x8000500D (E_ADS_PROPERTY_NOT_FOUND)。 关于如何获取邮件属性的任何想法?这是我的代码。

HRESULT hr = CoInitialize(NULL);
if (hr == S_OK || hr == S_FALSE)
{
    IADs *pUsr = NULL;
    hr = ADsGetObject(L"WinNT://adomainname/ausername,user", IID_IADs, (void**)&pUsr);
    if (SUCCEEDED(hr))
    {
        VARIANT var;
        VariantInit(&var);

        LPWSTR pszAttrs[] = { L"mail" };
        DWORD dwNumber = sizeof(pszAttrs) / sizeof(LPWSTR);
        HRESULT hrAry = ADsBuildVarArrayStr(pszAttrs, dwNumber, &var);
        hr = pUsr->GetInfoEx(var, 0);
        VariantClear(&var);

        if (SUCCEEDED(hrAry) && SUCCEEDED(hr))
        {
            hr = pUsr->Get(CComBSTR("mail"), &var);
            if (SUCCEEDED(hr))
            {
                printf("mail: %S\n", V_BSTR(&var));
                VariantClear(&var);
            }
        }
        if (pUsr)
            pUsr->Release();
    }
    CoUninitialize();
}

使用 WinNT 提供程序时 mail 属性不可用:Unsupported IADsUser Properties

您必须使用 LDAP。

如果您有帐户的 distinguishedName,您可以使用:

hr = ADsGetObject(L"LDAP://CN=someuser,OU=Users,DC=example,DC=com", IID_IADs, (void**)&pUsr);

如果您只有域和用户名,那么您可以使用 LDAP://adomainname 并使用过滤器在域中搜索用户名:

(&(objectClass=user)(objectCategory=person)(sAMAccountName=ausername))

或者您可以使用 IADsNameTranslate 将 domain\username (ADS_NAME_TYPE_NT4) 转换为专有名称 (ADS_NAME_TYPE_1779)。