Lots of organizations / companies use dynamic distribution groups in Exchange. While these groups allow for low administrative overhead, they don't allow users to know who the email is going to until the email has been sent. This Sharepoint webpart allows users to see who is in a group before the email is sent.
Using the Code
Before you begin, you must have the Exchange Management Console installed on your server. If you are planning to deploy this in Sharepoint, you will also need to edit your web.config to read:
<trust level="Full" originUrl="" />
In Visual Studio 2010, create a new Empty SharePoint Project. Add a new Visual Web Part Item. Add the
System.Management.Automation reference to your project. Include the following 3 items in your
We need to open the Exchange management PowerShell snappin:
RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
PSSnapInException snapInException = null;
PSSnapInInfo info = rsConfig.AddPSSnapIn
("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);
Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
Next, we need to send the
cmdlet into powershell. In this case, I am asking to
Get-DynamicDistributionGroup with the
groupName being a variable I had the user select from a drop down.
Pipeline pipeLine = myRunSpace.CreatePipeline();
Command myCommand = new Command("Get-DynamicDistributionGroup");
CommandParameter identityParam = new CommandParameter("Identity", groupName);
Collection<PSObject> commandResults = pipeLine.Invoke();
PSObject distGroup = commandResults;
Runspace recipientRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
Once we have the Dynamic Distribution Group's Name, we need its recipients.
pipeLine = recipientRunSpace.CreatePipeline();
myCommand = new Command("Get-Recipient");
if (distGroup.Members["RecipientFilter"] != null &&
distGroup.Members["RecipientFilter"].Value.ToString().Length > 0)
CommandParameter recipientFilter = new CommandParameter
CommandParameter OU = new CommandParameter("OrganizationalUnit", distGroup.Members
commandResults = pipeLine.Invoke();
Next, I build a list of all the user's names from that group. The list of names is then bound to a bulleted List.
List<string> nameList = new List<string>();
foreach (PSObject cmdlet in commandResults)
if (cmdlet.Properties["Name"] != null &&
cmdlet.Properties["Name"].Value.ToString().Length > 0)
string recipientName = cmdlet.Properties["Name"].Value.ToString();
BulletedList1.DataSource = nameList;
The last thing I did was change the
DisplayMode of the bulleted list to
LinkButton. This makes the user's names hyperlinks which go to the Sharepoint MySite page.
protected void BulletedList1_Click(object sender, BulletedListEventArgs e)
ListItem li = BulletedList1.Items[e.Index];
Response.Redirect("http://sharepoint peoplesearch URL"
- 8th December, 2010: Initial post