首页 > 解决方案 > ActiveDirectory/C++:如何将 Guid 转换为用户名?

问题描述

标题中的问题。我有一个用户的 Guid,并且想从 Active Directory 中获取用户名。我一直在谷歌搜索并查看Microsoft 的示例,但无法使其正常工作。我得到的每一个谷歌点击都展示了如何在 C# 中做到这一点,而我需要它在 C++ 中。有任何想法吗?最好我只想从 AD 获取用户名,但也感谢任何使示例正常工作的建议。

在我链接到的任何 dll 中都找不到IID_IDirectorySearch外部符号。IID_IADs

更新:感谢 Gabriels 的回答,我现在可以获得给定的名称。但我仍然找不到 UserPrincipalName//logonName/sAMAccountName。

// Using this code to get the user object:
hr = ADsGetObject(L"LDAP://<GUID=XXXXXXXX-XX...>",
                  IID_IADsUser,
                  (void**)&pADsUser);
// Then trying different ways of getting the logon name:
pADsUser->Get(BSTR("sAMAccountName"), &var);
pADsUser->get_Name(&sbstr); 

我错过了什么?

更新2。这是我的代码。

IADsUser* pADsUser = NULL;
BSTR sbstr;

HRESULT hr = CoInitialize(NULL);
if (hr != S_OK) { return; }

hr = ADsGetObject(L"LDAP://<GUID=XXX-YYY>",
    IID_IADsUser,
    (void**)&pADsUser);

if (hr != S_OK) { return; }

// This works
if (S_OK == pADsUser->get_FullName(&sbstr)) {
    printf("Full Name: %S\n", sbstr);
}

// This doesn't. Get returns 0x8000500d
VARIANT var;
VariantInit(&var);
hr = pADsUser->Get(BSTR("sAMAccountName"), &var);
if (SUCCEEDED(hr))
{
    printf("FullName: %S\n", V_BSTR(&var));
    VariantClear(&var);
}
pADsUser->Release();
CoUninitialize();

标签: c++windowsactive-directory

解决方案


您包含的那个链接是关于执行搜索的。但如果您有 GUID,则无需搜索。您可以使用以下格式的 LDAP 路径使用 GUID 直接绑定到对象:

LDAP://servername/<GUID=XXXXX>

servername如果您正在运行的计算机与您正在寻找的帐户加入相同或受信任的域,您可以排除这种情况。

更多详细信息:使用 objectGUID 绑定到对象

绑定后,然后您阅读sAMAccountName以获取用户名。

至于链接,您需要包含activeds.h并链接到ActiveDS.liband ADSIid.lib(两者都在 Windows SDK 中找到)。此处有更多详细信息(这是一篇旧文章,但仍然相关):为 ADSI 开发设置 Visual C++ 6.0

的文档中IADs::Get有示例代码,它向您展示了如何获取单值和多值属性。像这样的东西应该适用于sAMAccountName

VARIANT var;
VariantInit(&var);

hr = pUsr->Get(CComBSTR("sAMAccountName"), &var );
if ( SUCCEEDED(hr) )
{
    printf("User name: %S\n", V_BSTR(&var) );
    VariantClear(&var);
}

推荐阅读