根据我在 C# 中运行 powershell 和 Microsoft Exchange 代码的经验,可能有点棘手。这是我必须做的:
在像这样App.Config
添加useLegacyV2RuntimeActivationPolicy="true"
到启动标记中(您不必拥有 .net 4.5)这允许 Microsoft.Exchange.Management.PowerShell.Admin 正确加载(您必须在本地计算机上安装 Exchange 工具跑步)。:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
然后,假设您已将System.Management.Automation
引用添加到项目中,您可以在 C# 中像这样构建 Powershell 查询:
string username = "username";
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript("param ([string]$user); add-pssnapin 'Microsoft.Exchange.Management.PowerShell.Admin';" +
"get-mailbox -Identity $user -resultsize unlimited | select Name -expand EmailAddresses | Select SmtpAddress;");
PowerShellInstance.AddParameter("user", username);
Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
if (PowerShellInstance.Streams.Error.Count > 0)
{
foreach (var error in PowerShellInstance.Streams.Error)
{
//for reading errors in debug mode
StringBuilder sb = new StringBuilder();
sb.AppendLine(error.Exception.Message);
sb.AppendLine(error.Exception.InnerException.Message);
sb.AppendLine(error.CategoryInfo.Category.ToString());
sb.AppendLine(error.CategoryInfo.Reason);
sb.AppendLine(error.ErrorDetails.Message);
sb.AppendLine(error.ErrorDetails.RecommendedAction);
Console.WriteLine(sb.ToString());
}
}
if (PSOutput.Count > 0)
{
foreach (var item in PSOutput)
{
Console.WriteLine(item);
}
}
}
我还必须更改我的项目以构建为 x64,因为 Exchange 的 powershell 插件是 64 位的。