2017-08-17 2 views
0

J'ai du mal à récupérer tous les groupes pour un utilisateur donné (domaine1/utilisateur1) ... Le programme C ci-dessous (exécuté sur une machine dans domain1) fonctionne bien mais il ne montre pas les groupes de l'autre domaine .. User1 fait aussi partie de domain2 mais le code ci-dessous ne montre pas cette information .. Je me casse la tête pour comprendre les autres options, mais pas de chance. . Pourriez-vous les gars fournir des suggestions ...Récupère tous les groupes (Global, Universel, Domaine-Local) pour un utilisateur donné

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; 

} 

Répondre

0

Je vous encourage vivement aurait à considérer autre chose que cette ancienne COM/ActiveX API. Par exemple, voici un script PowerShell que les requêtes pour une liste d'utilisateurs:

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() 
} 

L'autre question: Je ne sais pas combien il est facile de faire des requêtes inter-domaines - dans toutes les langues, avec une API.

Pour cet exemple, copiez le script sur un autre PC sur l'autre domaine, exécutez-le aux deux endroits et fusionnez simplement les résultats avec le bloc-notes.

ADDENDA:

Vous pouvez également trouver ce lien utile:

Search Active Directory for User and Office Locations