c#调用Invoke中的PowerShell cmd未返回特定用户电子邮件列表的PsObject
本文关键字:用户 邮件列表 PsObject 返回 Invoke 调用 中的 PowerShell cmd | 更新日期: 2023-09-27 18:19:37
我尝试通过c#使用此PowerShell命令获取exchange服务器中特定用户的电子邮件列表
"get-mailbox -Identity username -resultsize unlimited | select Name -expand EmailAddresses | Select SmtpAddress"
这在powershell控制台中工作
但是,如果我在PowerShell上调用Invoke,则不会返回PsObject,有办法解决这个问题吗?
我试着只调用这个脚本"get-mailbox -Identity user"
,我得到了一个PSObject,但我必须执行这个
Collection<PSObject> getInfo = new Collection<PSObject>();
getInfo = runExchCmd(Pscmd); // runExchCmd just a function to invoke PowerShellCommand to be execute and return Collection PSObject
PSMemberInfo psobjEmail = getInfo[0].Members["EmailAddresses"];
object obj = psobjEmail.Value;
但是,是的,这个值是一个长字符串,所有的电子邮件都与用户相关,只将每个电子邮件提取到数组中看起来很痛苦,有什么帮助吗?
根据我的经验,在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位的。