Q: How to get user details from Active Directory?
A: This example gets NT user name and domain name. Then it opens particular AD object and reads user information.
Code:
void ReadActiveDirectory()
{
IEnumVARIANT *pEnum = NULL;
IADsContainer *pCont = NULL;
IADs *pADs = NULL;
IDispatch *pDisp = NULL;
IADsUser *pUser = NULL;
VARIANT var; VariantInit(&var);
BSTR bstr, user_ADsPath;
ULONG lFetch;
HRESULT hr;
Text username, domainname;
CoInitialize(NULL);
//Read NT user name
memset (username, 0, sizeof (username));
unsigned long len = sizeof (username);
::GetUserName (username, &len);
//Read NT domain name
memset (domainname, 0, sizeof (domainname));
len = sizeof (domainname);
::GetComputerNameEx(ComputerNameDnsDomain, domainname, &len);
char *ch = strchr(domainname, '.');
if(ch) *ch = 0;
//Form the AD domain path
Text pathName;
strcpy(pathName, "WinNT://");
strcat(pathName, domainname);
CStringW str(pathName);
// Bind to ADs namespace
hr = ADsOpenObject(str, NULL,NULL,ADS_READONLY_SERVER,IID_IADsContainer, (void**) &pCont);
if ( !SUCCEEDED(hr) || !pCont ) return FALSE;
//Create an enumerator object in the container
hr = ADsBuildEnumerator(pCont, &pEnum);
// Now enumerate through all providers
while(hr == S_OK)
{
hr = ADsEnumerateNext(pEnum, 1, &var, &lFetch);
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
if(!pDisp) continue;
pDisp->QueryInterface(IID_IADsUser, (void**)&pUser);
pDisp->Release();
pDisp = NULL;
if(!pUser) continue;
hr = pUser->get_Class(&bstr);
if ( !SUCCEEDED(hr) ) continue;
if(CComBSTR("User") != CComBSTR(bstr)) continue;
hr = pUser->get_Name(&bstr);
if ( !SUCCEEDED(hr) ) continue;
if(CComBSTR(username) == CComBSTR(bstr))
{
pUser->get_ADsPath(&user_ADsPath);
hr = pUser->get_FullName(&bstr);
if ( SUCCEEDED(hr) )
full_name.SetAttr ((pchar)CString(bstr).GetString());
break;
}
pUser->Release();
pUser = NULL;
SysFreeString(bstr);
}
}
//Release the enumerator.
if (pEnum != NULL)
{
ADsFreeEnumerator(pEnum);
pEnum = NULL;
}
//Release the container.
if (pCont != NULL)
{
pCont->Release ();
pCont = NULL;
}
}