2017-11-21 2 views
0

Zur Zeit habe ich einen Powershell-Skript, das eine Sitzung mit und fragt dann eine Exchange-E-Mail mit der folgenden Abfrage erstellt:Get-MessageTrace zu Exchange Server mit C# Powershell

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 

Ich will mich dieses Skript aktualisieren, so Thay es läuft innerhalb C#, damit ich es als ein Service mit Feldern wie den Anfangs- und Enddaten ausführen kann, die automatisch laufen. Zu diesem Zweck habe ich es bis zu dem Punkt, wo ich eine Sitzung mit dem Server erstellen und dann die folgende Methode ausgeführt:

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(); 
    } 

, die die gesamte PSObject zurückgibt. Wenn ich jedoch versuche, die Filterung "| Received, SenderAddress, RecipientAddress, Size" einzufügen, werden keine Ergebnisse mehr angezeigt. Darüber hinaus gibt es ein Problem, bei dem ich den Runspace löschen und neu erstellen muss, wenn ich diese Methode ausführen möchte (oder irgendeine Abfrage, es scheint 1 Runspace, 1 Abfrage zu sein). Es bringt normalerweise ungefähr 30.000 Resultate zurück und die maximale Größe, die ich auf einmal bekommen kann, ist 5.000, was den Prozess ziemlich zeitaufwendig macht.

Ich bin neu in dieser Art von Powershell/C# Integration, so dass ich nicht sicher bin, was ich vermisse. Wenn jemand von Ihnen weiß, wie ich die Filterung einbeziehe oder irgendwelche Ratschläge/Best Practices im Umgang mit dieser Art von Operationen habe, würde ich es sehr begrüßen.

Antwort

0

Sie sollten Invoke-Command nicht verwenden müssen, vorausgesetzt, Ihr Runspace ist über New-PSSession & Import-PSSession mit Exchange verbunden. Sehen Sie diesen Beitrag, wie man das macht: Exchange PowerShell commands through C#.

Der Grund, warum "| Select ..." fehlgeschlagen ist, liegt in der ScriptBlock.Create() - Zeichenfolge. Wie auch immer, ist unten (imho) ein sauberer Weg, dies zu tun:

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(); 
} 

Sie sollten es jedes Mal, ohne erneut zu benutzen, um Ihre Runspace der Lage sein, neu zu erstellen. Sie können jedoch auch ein PowerShell-Objekt anstelle des Runspace verwenden. Siehe den obigen Link für Details dazu.

+0

Danke für den Hinweis! Ich habe es geschafft, es ohne die Select-Anweisung arbeiten zu lassen, aber das verspricht eine viel bessere und viel effizientere Lösung für das Problem :) – GameCrazed

Verwandte Themen