現在、セッションを作成し、次のクエリで Exchange 電子メールをクエリする 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
このスクリプトを更新して 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 つのクエリのようです)。通常、約 30,000 件の結果が返され、一度に取得できる最大サイズは 5,000 であるため、このプロセスにはかなりの時間がかかります。
この種の Powershell/C# 統合は初めてなので、何が欠けているのかわかりません。フィルタリングを含める方法を知っている人や、この種の操作を処理する際のアドバイス/ベスト プラクティスを知っている人がいれば、非常に感謝しています。