2017-11-21 9 views
0

현재 내가 세션을 생성 한 후 다음 쿼리는 Exchange 전자 메일을 조회하는 PowerShell 스크립트가 : 나는 그래서이 스크립트를 업데이트 꿔C# PowerShell을 사용하여 Exchange 서버에-MessageTrace 얻기

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# 내에서 실행되므로 자동으로 업데이트되는 시작일과 종료일과 같은 필드가있는 서비스로 실행할 수 있습니다. 이를 위해 나는 다음과 같은 방법을 서버와의 세션을 생성하고 실행할 수있는 지점에있다 : 전체 PSObject을 반환

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

합니다. 그러나 "Select Received, SenderAddress, RecipientAddress, Size"필터링을 포함 시키려고하면 결과가 반환되지 않습니다. 이것의 맨 위에는 runspace를 처리하고이 메서드를 실행할 때마다 다시 만들어야하는 문제가 있습니다 (또는 모든 쿼리가 1 개의 runspace, 1 개의 쿼리 인 것 같습니다). 일반적으로 약 30,000 개의 결과를 가져 오며 한 번에 얻을 수있는 최대 크기는 5,000이므로 프로세스에 많은 시간이 소요됩니다.

저는 PowerShell/C# 통합의 이런 종류에 익숙하지 않아서 무엇이 실종되었는지 확실하지 않습니다. 어떤 유형의 작업을 처리 할 때 필자가 필터링을 포함하거나 조언/베스트 프랙티스를 가질 수있는 방법을 알고 있다면 크게 감사하겠습니다.

답변

0

Runspace가 New-PSSession & Import-PSSession을 통해 Exchange에 연결되었다고 가정 할 때 Invoke-Command를 사용할 필요가 없습니다. 이 작업을 수행하는 방법에 대한 내용은 Exchange PowerShell commands through C#을 참조하십시오.

"Select ..."를 추가하지 못한 이유는 ScriptBlock.Create() 문자열에 있어야하기 때문입니다. 어쨌든, 아래 (IMHO)이 할 수있는 청소기 방법입니다

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

당신은 그것을 매번 다시없이 실행 영역을 다시 사용할 수 있어야합니다. 그러나이를 수행하는 다른 방법은 runspace 대신 PowerShell 개체를 사용하는 것입니다. 이것에 대한 자세한 내용은 위의 링크를 참조하십시오.

+0

조언 해 주셔서 감사합니다. Select 문 없이도 작동하도록 만들었지 만 문제에 대한 훨씬 더 효율적이고 효율적인 방법을 약속합니다. – GameCrazed