【问题标题】:Fetch all groups (Global, Universal, Domain-Local) for a given user获取给定用户的所有组(全局、通用、域本地)
【发布时间】:2017-08-17 12:14:45
【问题描述】:

我正在努力获取给定用户 (domain1/user1) 的所有组... 下面的 C 程序(在 domain1 中的机器上运行)工作正常,但它不显示来自其他域的组.. User1 也是 domain2 的一部分,但下面的代码没有显示该信息.. 我打破了我的脑袋想出其他的选择,但没有运气.. 大家有什么建议吗...

void printGroups()
{
IADsUser *pUser;
IADsMembers *pGroups;
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) return -1;
IID iid = IID_IADsUser;
hr = ADsGetObject(L"WinNT://domain1/user1", &iid, (void**)&pUser);

if (FAILED(hr)) {
printf("blad");
return -1;
}

pUser->lpVtbl->Groups(pUser, &pGroups);
//pUser->Groups(&pGroups);
pUser->lpVtbl->Release(pUser);
//pUser->Release();
if (FAILED(hr)) return -1;

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

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

pUnk->lpVtbl->Release(pUnk);

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

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

}

【问题讨论】:

    标签: windows winapi win32-process


    【解决方案1】:

    我强烈建议您考虑除古老的 COM/ActiveX API 之外的其他东西。例如,这是一个查询用户列表的 PowerShell 脚本:

    import-module activedirectory
    echo ""
    echo "User Memberships:"
    try {
      $users = @(
        "John", 
        "Paul", 
        "George", 
        "Ringo")
      foreach ($u in $users) {
        echo "USER: $u"
        Get-ADUser  -Identity $u -Properties MemberOf
      }
    }
    catch {
      $errmsg = "ERROR:Get-ADGroupMember(" + $g + "): " + $error
      $errmsg
      $error.Clear()
    }
    

    另一个问题:我不确定使用任何语言、使用任何 API 进行跨域查询是否容易。

    对于本示例,我会将脚本复制到另一个域上的单独 PC,在两个地方运行它,然后将结果与记事本合并。

    附录:

    此链接可能对您也有帮助:

    Search Active Directory for User and Office Locations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多