Platform SDK: Active Directory, ADSI, and Directory Services |
The following code fragment contains a function that displays the members of a group using IADsGroup and IADsMembers:
////////////////////////////// /* PrintGroupObjectMembers() - Prints the members of the group that the pADsGroup passes. Parameters IADsGroup * pADsGroup - Group from which to list members */ HRESULT PrintGroupObjectMembers(IADsGroup * pADsGroup) { HRESULT hr = S_OK; // COM Result Code IADsMembers * pADsMembers = NULL; // Ptr to Members of the IADsGroup BOOL fContinue = TRUE; // Looping Variable IEnumVARIANT * pEnumVariant = NULL; // Ptr to the Enum variant IUnknown * pUnknown = NULL; // IUnknown for getting the ENUM initially VARIANT VariantArray[FETCH_NUM]; // Variant array for temp holding returned data ULONG ulElementsFetched = NULL; // Number of elements fetched // Get an interface pointer to the IADsCollection of members hr = pADsGroup->Members(&pADsMembers); if (SUCCEEDED(hr)) { // Ask the IADsCollection of members for a new ENUM Interface // Note the enum comes back as an IUnknown * hr = pADsMembers->get__NewEnum(&pUnknown); if (SUCCEEDED(hr)) { // QI the IUnknown * for a IEnumVARIANT interface hr = pUnknown->QueryInterface(IID_IEnumVARIANT, (void **)&pEnumVariant); if (SUCCEEDED(hr)) { // While have not hit errors or end of data.... while (fContinue) { ulElementsFetched = 0; // Get a "batch" number of group members- number of rows that FETCH_NUM specifies hr = ADsEnumerateNext(pEnumVariant, FETCH_NUM, VariantArray, &ulElementsFetched); if (ulElementsFetched )//SUCCEEDED(hr) && hr != S_FALSE) { // Loop through the current batch, printing // the path for each member for (ULONG i = 0; i < ulElementsFetched; i++ ) { IDispatch * pDispatch = NULL; // ptr for holding dispath of element IADs * pIADsGroupMember = NULL; // IADs ptr to group member BSTR bstrPath = NULL; // Holds path of object // Get the dispatch ptr for the variant pDispatch = VariantArray[i].pdispVal; assert(HAS_BIT_STYLE(VariantArray[i].vt,VT_DISPATCH)); // Get the IADs interface for the "member" of this group hr = pDispatch->QueryInterface(IID_IADs, (VOID **) &pIADsGroupMember) ; if (SUCCEEDED(hr)) { // Get the ADsPath property for //this member hr = pIADsGroupMember->get_ADsPath(&bstrPath) ; if (SUCCEEDED(hr)) { // Print the ADsPath of the //group member wprintf(L"\tMember Object: %ws\n", bstrPath); SysFreeString(bstrPath); } pIADsGroupMember->Release(); pIADsGroupMember = NULL; } } // Clear the variant array memset(VariantArray, 0, sizeof(VARIANT)*FETCH_NUM); } else fContinue = FALSE; } pEnumVariant->Release(); pEnumVariant = NULL; } pUnknown->Release(); pUnknown = NULL; } pADsMembers ->Release(); pADsMembers = NULL; } // If everything WENT ok, all the data // was printed, and an S_FALSE (indicating // no more data) was received. If that is the case, // you REALLY want to return an S_OK if (hr == S_FALSE) hr = S_OK; return hr; }
The following code fragment contains a function that displays the members of a group:
'//////////////////////////////////////////////////////////////////////////////////////////////////// ' PrintGroupObjectMembers() - Prints the members of passed IADsGroup ptr ' ' Parameters ' ' oADsGroup As IADsGroup - Group from which to list members ' 'HRESULT PrintGroupObjectMembers(IADsGroup * pADsGroup) Sub PrintGroupObjectMembers(oADsGroup As IADsGroup) Dim child As IADs For Each child In oADsGroup.Members PrintIADSObject child Next child End Sub