ADSI接口获取AD域内的信息
前戏:推荐一款工具:LDAPSoft Ldap Browser,有免费版。
通过COM接口递归获取所有指定OU下面的所有信息:name,mail等, The core code is as follows .
HRESULT hr;
IADsContainer *pContainer = NULL;
IEnumVARIANTPtr pEnum = NULL;
int pos = -1;
COleVariant varChild;
IADs *pADs1 = NULL;
CString strName, strDisplayName, strClass, strElement, strNewURL;
BSTR bstrValue;
CComBSTR bstrGuid;
int times=0;
int nChildCount = 0;
// 打开对像
CString Path = strLDAPURL;
CString strDomainName = strDOMAINNAME;
// Path="LDAP://" + Path + strDomainName;
Path = Path + strDomainName;
BSTR bstrUrl = Path.AllocSysString();
IADs *pADs=NULL;
WCHAR name[100],password[100];
memset(name, 0, 100);
memset(password, 0, 100);
CString UserName="testName";
CString PassWord="testPassword";
USES_CONVERSION;
LPWSTR pwStrName = new wchar_t[UserName.GetLength() + 1];
memset(pwStrName, 0, UserName.GetLength() + 1);
wcscpy(pwStrName, T2W((LPCTSTR)UserName));
LPWSTR pwStrPasswd = new wchar_t[PassWord.GetLength() + 1];
memset(pwStrPasswd, 0, PassWord.GetLength() + 1);
wcscpy(pwStrPasswd, T2W((LPCTSTR)PassWord));
hr=ADsOpenObject(bstrUrl, pwStrName, pwStrPasswd, ADS_SECURE_AUTHENTICATION,IID_IADsContainer,(void**)&pContainer);
mbstowcs(password, PassWord.GetBuffer(PassWord.GetLength()+1), PassWord.GetLength()+1 );
CString strOutLength;
strOutLength.Format("UserName len: %d PassWord len:%d ", UserName.GetLength(), PassWord.GetLength());
ICD_WritetoFile_C("UserName:"+ UserName + "Password: "+PassWord+ strOutLength);
SysFreeString( bstrUrl );
if (S_OK != hr)
{
ICD_WritetoFile_C("ADsOpenObject is return false");
goto label_Exit;
}
// 得到对象的枚举器
hr = ADsBuildEnumerator (pContainer,&pEnum);
if (S_OK != hr)
{
goto label_Exit;
}
// 枚举对象下的子项
while(1)
{
hr = ADsEnumerateNext (pEnum,1,&varChild,NULL);
if (S_FALSE == hr) //如果子项为空,则退出
{
//bRet = TRUE;
ICD_WritetoFile_C("//如果子项为空,则退出");
goto label_Exit;
}
nChildCount++;
hr = varChild.pdispVal->QueryInterface (IID_IADs,(void**)&pADs1);
if (S_OK != hr) //接口不支持
{
continue;
}
// 对象名称
hr = pADs1->get_Name(&bstrValue);
strName = bstrValue;
pos = strName.Find("=");
if (pos > 0)
{
strDisplayName = strName.Right(strName.GetLength() - pos - 1);
}
else
{
strDisplayName = strName;
}
// GUID
hr = pADs1->get_GUID( &bstrGuid );
strDisplayName = bstrGuid;
// 所在路径
hr = pADs1->get_ADsPath(&bstrValue);
strDisplayName = bstrValue;
CString strCurTmpPath;
strCurTmpPath = strDisplayName;
// 父结点
hr = pADs1->get_Parent(&bstrValue);
strDisplayName = bstrValue;
//类型
hr = pADs1->get_Class(&bstrValue);
strDisplayName = bstrValue;
if (strDisplayName == "organizationalUnit")
{
//递归
ReadAdTree(strCurTmpPath, "", vectorFilter);
}
//添加自己的过滤规则,GetFilter这个自己封装的过滤函数
if (GetFilter(vectorFilter, strCurTmpPath)) {
BSTR bstrValue = _bstr_t("mail");
VARIANT varOut;
//获取指定key的value
pADs1->Get(bstrValue, &varOut);
}
//
strName.Empty();
strClass.Empty();
strNewURL.Empty();
bstrGuid.Empty();
} //while
label_Exit:
{
if (pADs1)
pADs1->Release();
if (pContainer)
pContainer->Release();
return Path;
}
PS:有疑问可以留言,或者加我qq:65205929
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。