代码之家  ›  专栏  ›  技术社区  ›  GameCrazed

使用C#Powershell将MessageTrace获取到Exchange Server

  •  0
  • GameCrazed  · 技术社区  · 7 年前

    目前,我有一个Powershell脚本,用于创建与的会话,然后使用以下查询查询Exchange电子邮件:

    Get-MessageTrace -StartDate "10/07/2017 12:00 AM" -EndDate "11/06/2017 11:59 PM" -PageSize 5000 -Page $Page | Select Received,SenderAddress,RecipientAddress,Size
    

    我想更新这个脚本,使其在C#中运行,这样我就可以将其作为服务运行,并自动更新开始和结束日期等字段。为此,我可以创建与服务器的会话,然后运行以下方法:

    private static List<PSObject> RetrieveCurrentEmailList(string previousDate, DateTime currentDate, int pageSize,
            int currentPage, IReadOnlyList<PSObject> psConnection, Runspace runspace)
        {
            var powershell = PowerShell.Create();
            var command = new PSCommand();
            command.AddCommand("Invoke-Command");
            command.AddParameter("ScriptBlock",
                ScriptBlock.Create(
                    "Get-MessageTrace -StartDate \"" + previousDate
                    + "\" -EndDate \"" + currentDate.ToString("MM/dd/yyyy", CultureInfo.CreateSpecificCulture("en-US"))
                    + "\" -pageSize " + pageSize
                    + " -Page " + currentPage));
            //+ " | Select Received,SenderAddress,RecipientAddress,Size"));
            command.AddParameter("Session", psConnection[0]);
            powershell.Commands = command;
            powershell.Runspace = runspace;
            Console.WriteLine("Executing query for page: " + currentPage);
            return powershell.Invoke().ToList();
        }
    

    返回整个PSObject。然而,当我尝试包括“Select Received,SenderAddress,RecipientAddress,Size”过滤时,它停止返回结果。除此之外,还有一个问题,每次我想要运行这个方法(或任何查询,它似乎是1个运行空间,1个查询)时,我都必须处理运行空间并重新创建它。它通常会返回大约30000个结果,我一次最多可以得到5000个结果,这使得这个过程非常耗时。

    我是这种Powershell/C集成的新手,所以我不确定我错过了什么。如果你们中的任何人知道我在处理此类操作时如何包括过滤或有任何建议/最佳做法,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Michael Tucker    7 年前

    假设您的运行空间通过新的PSSession连接到Exchange,则不需要使用Invoke命令;导入PSSession。请参阅以下关于如何做到这一点的帖子: Exchange PowerShell commands through C# .

    添加“选择…”的原因失败是因为它需要在脚本块中。Create()字符串。无论如何,下面是一个更简洁的方法:

    using (var powershell = PowerShell.Create())
    {
        powershell.Runspace = runspace;
        powershell
           .AddCommand("Get-MessageTrace")
           .AddParameter("StartDate", previousDate)
           .AddParameter("EndDate", currentDate)
           .AddParameter("PageSize", pageSize)
           .AddParameter("Page", currentPage)
           .AddCommand("Select-Object")
           .AddParameter("Property", new string[] { "Received", "SenderAddress", "RecipientAddress", "Size" });
    
        Console.WriteLine("Executing query for page: " + currentPage);
        return powershell.Invoke().ToList();
    }
    

    您应该能够重新使用运行空间,而无需每次都重新创建它。然而,另一种方法是使用PowerShell对象而不是运行空间。有关详细信息,请参阅上面的链接。