C#调用PowerShell查询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

