前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AD域对接C++

AD域对接C++

作者头像
用户7886150
修改2021-02-19 15:44:47
1.4K0
修改2021-02-19 15:44:47
举报
文章被收录于专栏:bit哲学院

参考链接: C++ wcscpy()

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档