c#中的PowerShell cmd调用Invoke不返回特定用户电子邮件列表的PsObject
Posted
技术标签:
【中文标题】c#中的PowerShell cmd调用Invoke不返回特定用户电子邮件列表的PsObject【英文标题】:PowerShell cmd in c# call Invoke return no PsObject for specific user email list 【发布时间】:2015-10-28 18:11:53 【问题描述】:我尝试通过 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;
但是是的,该值是某种长字符串,所有电子邮件都与用户相关联,将每封电子邮件提取到数组中似乎很痛苦?
【问题讨论】:
【参考方案1】:根据我在 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 位的。
【讨论】:
以上是关于c#中的PowerShell cmd调用Invoke不返回特定用户电子邮件列表的PsObject的主要内容,如果未能解决你的问题,请参考以下文章
将 PowerShell 参数传递给 Process.Start
在 C# 中使用不同的凭据调用远程 powershell 脚本
在powershell-ise中怎么调用powershell中的函数