HOWTO: Find Distribution List Membership for a Given Recipient

ID: Q220043


The information in this article applies to:


SUMMARY

You can use the Active Directory Service Interfaces (ADSI) to obtain the distribution list membership for a given Microsoft Exchange Server Recipient object. This article describes how to accomplish this using either Microsoft Visual C++ or Microsoft Visual Basic.

NOTE: This is an alternative to using the members collection returned by the IADsUser::Groups method. One key difference is that enumerating the members collection will give you the group objects rather than the group names. See the documentation for IADsUser::Groups for more information.


MORE INFORMATION

An Exchange Server Recipient object holds its distribution list(s) membership through the LDAP memberOf attribute. This attribute is either returned as a single string or a variant array of strings.

The following code will bind to a Recipient object using LDAP, cache the membership attribute, and print the distribution list(s) to the screen.

Using Visual C++


/*
   include activeds.h
   link with activeds.lib and adsiid.lib
*/ 

HRESULT func ()
{
   HRESULT hr;
   IADs *pADs;
   VARIANT pvProp;
   BSTR bstrpropName;
   long lLBound, lUBound;
      
   // Initialization
   VariantInit(&pvProp);
   CoInitialize(NULL);
   bstrpropName = SysAllocString(L"memberOf");
      
   // Bind to an Exchange recipient object
   hr = ADsGetObject(L"LDAP://servername/o=org/ou=site/cn=recipients/cn=fhc", IID_IADs, (void**) &pADs );
   if ( !SUCCEEDED(hr) )
   {
      return hr;
   }
      
   // Get recipient's members
   hr = pADs->Get(bstrpropName, &pvProp);
   if (FAILED(hr))
   {
      return hr;
   }
   
   if (VT_BSTR == pvProp.vt)  /* only one DL */ 
   {
      printf ("%S\n", pvProp.bstrVal);
   }
   else                 /* multiple DLs in an array */ 
   {
      SafeArrayGetLBound(pvProp.parray, 1, &lLBound);
      SafeArrayGetUBound(pvProp.parray, 1, &lUBound);
      
      for (long i = lLBound; i <= lUBound; i++)
      {
         VARIANT svar;
         SafeArrayGetElement(pvProp.parray, &i, &svar);
         if (VT_BSTR == svar.vt && svar.bstrVal)
            printf("\n%S",svar.bstrVal);
      }
   }
   
   // Releasing
   VariantClear(&pvProp);
   SysFreeString (bstrpropName);
   pADs->Release();
   
   return S_OK;
} 

Using Visual Basic


Dim RecipObj As IADs
Dim memberOf As Variant

Set RecipObj = GetObject("LDAP://servername/o=org/ou=site/cn=recipients/cn=fhc")
memberOf = RecipObj.Get("memberOf")

If IsArray(memberOf) Then 'User is on more than one DL
    For Each member In memberOf
       Debug.Print member
    Next
Else
    Debug.Print memberOf
End If 

Additional query words: kbXchge kbXchge550 kbMsg kbADSI kbGrpMsg


Keywords          : kbADSI kbXchge kbXchge550 kbMsg kbGrpMsg 
Version           : winnt:5.5
Platform          : winnt 
Issue type        : kbhowto 

Last Reviewed: April 8, 1999