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