获取给定用户的所有组(全局,通用,域 - 本地)

时间:2017-08-17 01:32:45

标签: windows winapi win32-process

我正在努力为给定用户(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;

}

1 个答案:

答案 0 :(得分:0)

除了那个古老的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