【问题标题】:How do I acquire an IADsUser object for use with the Active Directory API?如何获取 IADsUser 对象以用于 Active Directory API?
【发布时间】:2018-11-19 20:52:34
【问题描述】:

如何设置传入参数 pUser 以传递给此函数 CheckUserGroups(IADsUser *pUser)?我在另一个帖子上看到了功能,但他们没有详细解释:Need to retrieve all groups a user belongs to... in C++

请指教。

HRESULT CheckUserGroups(IADsUser *pUser)
{
  IADsMembers *pGroups;
  HRESULT hr = S_OK;

  hr = pUser->Groups(&pGroups);
  pUser->Release();
  if (FAILED(hr)) return hr;

  IUnknown *pUnk;
  hr = pGroups->get__NewEnum(&pUnk);
  if (FAILED(hr)) return hr;
  pGroups->Release();

  IEnumVARIANT *pEnum;
  hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
  if (FAILED(hr)) return hr;

  pUnk->Release();

  // Enumerate.
  BSTR bstr;
  VARIANT var;
  IADs *pADs;
  ULONG lFetch;
  IDispatch *pDisp;

  VariantInit(&var);
  hr = pEnum->Next(1, &var, &lFetch);
  while(hr == S_OK)
  {
    if (lFetch == 1)
    {
      pDisp = V_DISPATCH(&var);
      pDisp->QueryInterface(IID_IADs, (void**)&pADs);
      pADs->get_Name(&bstr);
      printf("Group belonged: %S\n",bstr);
      SysFreeString(bstr);
      pADs->Release();
    }
    VariantClear(&var);
    pDisp=NULL;
    hr = pEnum->Next(1, &var, &lFetch);
  };
  hr = pEnum->Release();
  return S_OK;
}

【问题讨论】:

    标签: c++ winapi active-directory


    【解决方案1】:

    这是一个创建和设置IADsUser *pUser的示例(将“管理员”更改为您的用户名):

        HRESULT hr = S_OK;
        IADsUser *pUser;
        _bstr_t bstr;
        DWORD ll_len = 255;
        char lbBuffer[255];
        ::GetComputerName(lbBuffer, &ll_len);
    
        bstr = "WinNT://" + _bstr_t(lbBuffer) + "/" + _bstr_t("Administrator") + ",user";
    
        hr = CoInitialize(NULL);
        hr = ADsGetObject(bstr, IID_IADsUser, (void **)&pUser);
    
        if (SUCCEEDED(hr))
        {
            hr = CheckUserGroups(pUser);
            /*
            hr = pUser->SetPassword(_bstr_t("123456"));
    
            if (SUCCEEDED(hr))
            {
                CoUninitialize();
                return TRUE;
            }
            */
        }
        CoUninitialize();
    

    对于LDAP,可以参考this document的例子,修改ADsGetObject的第一个参数。

    【讨论】:

    • 感谢您的评论。您的示例仅适用于本地用户吗?我将如何为 LDAP 做这件事?
    • @DestryGleason 您可以从this document中的示例中获得帮助
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多