You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用PowerShell查询Exchange邮件跟踪日志输出异常求解

解决Exchange邮件追踪日志输出显示类型名的问题

这问题我之前也碰到过!你看到的那些Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent其实是对象的默认ToString()输出——因为Get-MessageTrackingLog返回的是强类型对象,直接调用ToString()只会显示它的类型名称,不会自动展开属性内容。要显示实际的邮件信息,你需要提取对象的具体属性,或者在PowerShell层面先把结果格式化为可读文本。

方案一:在C#中直接提取对象属性

MessageTrackingEvent包含很多有用的属性,比如Timestamp(时间戳)、Sender(发件人)、Recipients(收件人)、MessageSubject(邮件主题)等。你可以在遍历PSObject时,直接访问这些属性的值:

StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in mailBoxes)
{
    // 提取关键属性,注意处理可能的null值
    string timestamp = obj.Properties["Timestamp"].Value?.ToString();
    string sender = obj.Properties["Sender"].Value?.ToString();
    // 收件人是集合,需要转成字符串
    IEnumerable<string> recipientsList = obj.Properties["Recipients"].Value as IEnumerable<string>;
    string recipients = recipientsList != null ? string.Join(";", recipientsList) : "";
    string subject = obj.Properties["MessageSubject"].Value?.ToString();

    // 自定义输出格式
    stringBuilder.AppendLine($"📅 时间: {timestamp}");
    stringBuilder.AppendLine($"📤 发件人: {sender}");
    stringBuilder.AppendLine($"📥 收件人: {recipients}");
    stringBuilder.AppendLine($"📝 主题: {subject}");
    stringBuilder.AppendLine("----------------------------------------");
}
textBox3.Text = stringBuilder.ToString();

如果不确定有哪些属性,可以先在Exchange的PowerShell中运行:

Get-MessageTrackingLog | Get-Member

查看MessageTrackingEvent的所有可用属性,按需调整提取逻辑。

方案二:在PowerShell中预先格式化结果

如果你不想在C#里处理属性提取,可以让PowerShell直接返回格式化好的文本(比如CSV或表格),这样C#只需要直接拼接结果即可:

修改Invoke-Command的ScriptBlock,用Select-Object筛选需要的属性,再用ConvertTo-Csv转成可读格式:

command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create(@"
Get-MessageTrackingLog -Start '01/25/2018 00:00:00' -End '01/25/2018 01:00:00' -Recipients 'user@domain' |
Select-Object Timestamp, Sender, Recipients, MessageSubject |
ConvertTo-Csv -NoTypeInformation
"));

然后在C#中直接遍历结果:

StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in mailBoxes)
{
    stringBuilder.AppendLine(obj.ToString());
}
textBox3.Text = stringBuilder.ToString();

这样返回的就是结构化的CSV文本,直接显示在textBox里会很清晰。如果想要更像表格的格式,可以把ConvertTo-Csv换成Format-Table -AutoSize | Out-String。


内容的提问来源于stack exchange,提问作者useresxi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:09