AD域对接C++

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值