微软的很多服务都是以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); } } }