public static DistributionGroup UpdateDistributionGroup(DistributionGroup group)
 {
     PowerShellComponent.ManagementCommands objManage = new PowerShellComponent.ManagementCommands();
     string updatedGroupXml = objManage.UpdateDistributionGroup(XmlSerializationHelper.Serialize(group));
     return XmlSerializationHelper.Deserialize<DistributionGroup>(updatedGroupXml);
 }
        // GetDistributionGroup()
        // desc: Method returns a list of Distribution Groups
        // params: sring identity - Name of Distribution group to return
        // method: public
        // return: string
        public string GetDistributionGroup(string identity, int current_page, int per_page, string ou)
        {
            String ErrorText = "";
            RunspaceConfiguration config = RunspaceConfiguration.Create();
            DistributionGroup group = null;
            List<DistributionGroup> groups = new List<DistributionGroup>();
            PSSnapInException warning;
            int total_entries = 0;
            // Load Exchange PowerShell snap-in.
            config.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out warning);
            if (warning != null) throw warning;

            using (Runspace thisRunspace = RunspaceFactory.CreateRunspace(config))
            {
                try
                {
                    thisRunspace.Open();
                    using (Pipeline thisPipeline = thisRunspace.CreatePipeline())
                    {

                        thisPipeline.Commands.Add("Get-DistributionGroup");
                        if (identity != "") thisPipeline.Commands[0].Parameters.Add("Identity", @identity);
                        thisPipeline.Commands[0].Parameters.Add("SortBy", "DisplayName");
                        try
                        {
                            List<PSObject> original_results = thisPipeline.Invoke().ToList();
                            IEnumerable<PSObject> results = null;

                            if (ou != "")
                                original_results = original_results.Where(x => x.Members["OrganizationalUnit"].Value.ToString() == ou).ToList();
                            total_entries = original_results.Count;
                            if (current_page == 0 && per_page == 0)
                                results = original_results;
                            else if (current_page < 2)
                                results = original_results.Take<PSObject>(per_page);// + 1); // This one is working as you would expect, as opposed to users. not sure what was done there
                            else
                                results = original_results.Skip<PSObject>((current_page - 1) * per_page).Take<PSObject>(per_page);
                           foreach (PSObject result in results)
                           {

                               group = new DistributionGroup();

                               foreach (PSMemberInfo member in result.Members)
                               {
                                   switch (member.Name)
                                   {
                                       case "Alias":
                                           group.Alias = member.Value.ToString().Trim();
                                           break;
                                       case "Name":
                                           group.Name = member.Value.ToString().Trim();
                                           break;
                                       case "DisplayName":
                                           group.displayName = member.Value.ToString().Trim();
                                           break;
                                       case "GroupType":
                                           group.groupType = member.Value.ToString().Trim();
                                           break;
                                       case "PrimarySmtpAddress":
                                           group.primarySmtpAddress = member.Value.ToString();
                                           break;
                                       case "CustomAttribute11": // We're using attribute 11 to indicate if we have children or not. it will be blank or true most likely
                                           bool hasChildren;
                                           if (bool.TryParse(member.Value.ToString().Trim(), out hasChildren) && hasChildren)
                                               group.HasChildren = true;
                                           else
                                               group.HasChildren = false;
                                           break;
                                   }

                               }
                               if (group.displayName.Length > 0)
                               {
                                   group.users = new ExchangeUserMembers();
                                   if (identity != "")
                                       group.users.users = GetDistributionGroupMembers(group.Name);
                                   groups.Add(group);
                               }

                           }

                        }
                        catch (Exception ex)
                        {
                            ErrorText = "Error: " + ex.ToString();
                            return ErrorText;
                        }
                        // Check for errors in the pipeline and throw an exception if necessary.
                        if (thisPipeline.Error != null && thisPipeline.Error.Count > 0)
                        {
                            StringBuilder pipelineError = new StringBuilder();
                            pipelineError.AppendFormat("Error calling Get-DistributionGroup.");
                            foreach (object item in thisPipeline.Error.ReadToEnd())
                            {
                                pipelineError.AppendFormat("{0}\n", item.ToString());
                            }
                            ErrorText = ErrorText + "Error: " + pipelineError.ToString();
                            return ErrorText;
                        }

                    }

                }
                finally
                {
                    thisRunspace.Close();
                }

            }
            var shorty = new DistributionGroupsShorter() { PerPage = per_page, CurrentPage = current_page,
                TotalEntries = total_entries, groups = groups };
            return XmlSerializationHelper.Serialize(shorty);
        }
 public static void DeleteDistributionGroup(DistributionGroup group)
 {
     PowerShellComponent.ManagementCommands objManage = new PowerShellComponent.ManagementCommands();
     objManage.DeleteDistributionGroup(XmlSerializationHelper.Serialize(group));
 }
        // CreateDistributionGroup()
        // desc: Method creates a new distribution list
        // params: string group_name - Name of new disitribution list
        // method: public
        // return: bool
        public string CreateDistributionGroup(string group_name, string ou, string auth_enabled)
        {
            RunspaceConfiguration config = RunspaceConfiguration.Create();
            PSSnapInException warning;
            config.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out warning);
            if (warning != null) throw warning;

            DistributionGroup group = new DistributionGroup() { error = "" };

            using (Runspace thisRunspace = RunspaceFactory.CreateRunspace(config))
            {
                try
                {
                    thisRunspace.Open();
                    using (Pipeline thisPipeline = thisRunspace.CreatePipeline())
                    {
                        try
                        {
                            thisPipeline.Commands.Add("New-DistributionGroup");
                            thisPipeline.Commands[0].Parameters.Add("Name", @group_name);
                            thisPipeline.Commands[0].Parameters.Add("Type", @"Distribution");
                            thisPipeline.Commands[0].Parameters.Add("OrganizationalUnit", @ou);
                            thisPipeline.Commands[0].Parameters.Add("SamAccountName", @group_name);
                            thisPipeline.Commands[0].Parameters.Add("Alias", @group_name.Replace(" ", ""));
                            try
                            {
                                thisPipeline.Invoke();
                                DistributionGroupsShorter shorty = XmlSerializationHelper.Deserialize<DistributionGroupsShorter>(GetDistributionGroup(group_name, 0, 0, ""));
                                if (shorty.groups.Count > 0)
                                    group = shorty.groups[0];
                                else
                                    throw new Exception("Group creation failed somewhere, new group was not found");

                                // rewrite CustomAttribute1 to be OU
                                using (Pipeline pipey = thisRunspace.CreatePipeline())
                                {
                                    pipey.Commands.Add("Set-DistributionGroup");
                                    pipey.Commands[0].Parameters.Add("Identity", group.Alias);
                                    pipey.Commands[0].Parameters.Add("DomainController", AppSettings["domainController"].Value);
                                    pipey.Commands[0].Parameters.Add("RequireSenderAuthenticationEnabled", Int32.Parse(@auth_enabled));
                                    pipey.Commands[0].Parameters.Add("CustomAttribute1", ou);
                                    pipey.Invoke();
                                }
                            }
                            catch (Exception ex)
                            {
                                group.error += " Error: " + ex.ToString();
                            }
                            // Check for errors in the pipeline and throw an exception if necessary.
                            if (thisPipeline.Error != null && thisPipeline.Error.Count > 0)
                            {
                                StringBuilder pipelineError = new StringBuilder();
                                pipelineError.AppendFormat("Error calling New-DistributionGroup.");
                                foreach (object item in thisPipeline.Error.ReadToEnd())
                                {
                                    pipelineError.AppendFormat("{0}\n", item.ToString());
                                }
                                group.error += " Error: " + pipelineError.ToString();
                            }
                        }
                        catch (Exception ex)
                        {
                            group.error += " Error: " + ex.ToString();
                        }
                    }
                }
                finally
                {
                    thisRunspace.Close();
                }
            }

            return XmlSerializationHelper.Serialize(group);
        }