C#代码中运行PowerShell命令的方法

微软的很多服务都是以PowerShell命令行管理的,比如Exchange PDL操作, Office365授权等。

如果需要自动化这些管理这些服务可以直接写PS脚本,也可以在C#代码中直接运行PowerShell命令。运行PowerShell命令主要用到的类是System.Management.Automation.Powershell。下面的代码就实现了Exchange PDL相关操作:

    public class ExchangePowershell
    {
        PowerShell ps;

        public ExchangePowershell()
        {
            try
            {
                ps = PowerShell.Create();
                SecureString pass = new NetworkCredential("", Config.AdAdminPassword).SecurePassword;
                var creds = new PSCredential(Config.AdAdminAccount, pass);

                if (ps.Commands != null)
                    ps.Commands.Clear();
                var newSession = ps
                     .AddCommand("New-PSSession")
                     .AddParameter("ConfigurationName", "Microsoft.Exchange")
                     .AddParameter("ConnectionUri", Config.ExchangeURL)
                     .AddParameter("Credential", creds)
                     .AddParameter("Authentication", "Kerberos")
                     //.AddParameter("AllowRedirection", true)
                     .Invoke();

                if (ps.Commands != null)
                    ps.Commands.Clear();
                var session = newSession[0];
                var import = ps
                     .AddCommand("Import-PSSession")
                     .AddParameter("Session", session)
                     .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("初始话PDL操作失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("初始话PDL操作失败,消息:{0}", ex.Message), ex);
            }
        }

        public void AddGroup(string groupID, string name, string emailAddress)
        {
            try
            {
                CommonFunc.Info(String.Format("添加PDL: {0},{1},{2}", groupID, name, emailAddress));
                if (ps.Commands != null)
                    ps.Commands.Clear();
                var PSOutput = ps
                    .AddCommand("New-DistributionGroup")
                    .AddParameter("Name", String.Format("{0} ({1})", name, groupID))
                    .AddParameter("DisplayName", name)
                    .AddParameter("OrganizationalUnit", Config.AdGroupOU)
                    .AddParameter("PrimarySmtpAddress ", emailAddress)
                    .AddParameter("SamAccountName", "OaSync" + groupID)
                    .AddParameter("Confirm", false)
                    .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("添加PDL失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("添加PDL失败,消息:{0}", ex.Message), ex);
            }
        }

        public void UpdateGroup(string groupID, string name, string emailAddress, bool showInGAL)
        {
            try
            {
                CommonFunc.Info(String.Format("更新PDL: {0},{1},{2},{3}", groupID, name, emailAddress, showInGAL));
                if (ps.Commands != null)
                    ps.Commands.Clear();
                var PSOutput = ps
                    .AddCommand("Set-DistributionGroup")
                    .AddParameter("Identity", "OaSync" + groupID)
                    .AddParameter("Name", String.Format("CN={0} ({1})", name, groupID))
                    .AddParameter("DisplayName", name)
                    .AddParameter("HiddenFromAddressListsEnabled", !showInGAL)
                    .AddParameter("PrimarySmtpAddress ", emailAddress)
                    .AddParameter("Confirm", false)
                    .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("更新PDL失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("更新PDL失败,消息:{0}", ex.Message), ex);
            }
        }

        public void DeleteGroup(string groupID)
        {
            try
            {
                CommonFunc.Info(String.Format("删除PDL: {0}", groupID));
                if (ps.Commands != null)
                    ps.Commands.Clear();
                var PSOutput = ps
                    .AddCommand("Remove-DistributionGroup")
                    .AddParameter("Identity", "OaSync" + groupID)
                    .AddParameter("Confirm", false)
                    .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("删除PDL失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("删除PDL失败,消息:{0}", ex.Message), ex);
            }
        }

        public void AddGroupMember(string groupID, string memberEmail)
        {
            try
            {
                CommonFunc.Info(String.Format("添加PDL成员: {0},{1}", groupID, memberEmail));
                if (ps.Commands != null)
                    ps.Commands.Clear();
                var PSOutput = ps
                    .AddCommand("Add-DistributionGroupMember")
                    .AddParameter("Identity", "OaSync" + groupID)
                    .AddParameter("Member", memberEmail)
                    .AddParameter("Confirm", false)
                    .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("添加PDL成员失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("添加PDL成员失败,消息:{0}", ex.Message), ex);
            }
        }

        public void DeleteGroupMember(string groupID, string memberEmail)
        {
            try
            {
                CommonFunc.Info(String.Format("删除PDL成员: {0},{1}", groupID, memberEmail));
                if (ps.Commands != null)
                    ps.Commands.Clear();
                var PSOutput = ps
                    .AddCommand("Remove-DistributionGroupMember")
                    .AddParameter("Identity", "OaSync" + groupID)
                    .AddParameter("Member", memberEmail)
                    .AddParameter("Confirm", false)
                    .Invoke();
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("删除PDL成员失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("删除PDL成员失败,消息:{0}", ex.Message), ex);
            }
        }

        public void Dispose()
        {
            try
            {
                if(ps != null)
                {
                    //Remove session
                    if (ps.Commands != null)
                        ps.Commands.Clear();
                    ps
                     .AddCommand("Get-PSSession")
                     .AddCommand("Remove-PSSession")
                     .Invoke();
                    ps.Dispose();
                }
                if (ps.Streams != null && ps.Streams.Error != null && ps.Streams.Error.Count > 0)
                {
                    CommonFunc.Error(String.Format("注销PDL操作失败,消息:{0}", ps.Streams.Error[0]));
                    ps.Streams.Error.Clear();
                }
            }
            catch (Exception ex)
            {
                CommonFunc.Error(String.Format("注销PDL操作失败,消息:{0}", ex.Message), ex);
            }
        }
    }
此条目发表在文章分类目录。将固定链接加入收藏夹。

发表评论