Como posso mover itens do Exchange para um PST usando o PowerShell?

2

Temos uma caixa de correio que recebe e-mails de status que precisamos manter essencialmente para sempre e eles contêm anexos potencialmente grandes. Eu preciso ser capaz de mover essas mensagens para um PST em uma base regular (diária ou semanal) para que deseja automatizar isso.

No momento, estou usando um MailboxExportRequest para colocá-los em um PST:

New-MailboxExportRequest -ContentFilter {(Received -ge '01/01/2013') -and (Received -lt '01/02/2013')} -Mailbox "MonitorMailbox" -FilePath "\Server\backup\EmailLog\MonitorMailbox 2013-01.pst"

E eu sigo isso com um SearchMailbox -DeleteContent :

Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:01/01/2013..01/02/2013" -DeleteContent

O problema é que tenho que atualizar manualmente os parâmetros de data a cada vez em quatro lugares, e estou preocupado que não seja muito transacional (se isso fizer sentido nesse contexto) .

Estou tentando criar um pequeno script PS para percorrer datas por mês e criar um conjunto de comandos para girar e exportar essas informações, mas queria saber se existe uma maneira mais simples de "mover para o PST" ou se Eu preciso tentar construir as declarações acima dinamicamente.

Aqui está um script mais completo, como eu tenho até agora, que deve exportar todos os itens para os 10 dias anteriores ao início deste mês (para acelerar o teste):

$mailbox = "Cylindric"
$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddDays(-10)

$month = "{0:D2}" -f [int]$startDate.Month
$year = "{0:D4}" -f [int]$startDate.Year


Write-Host -NoNewline "Exporting items between $startDate and $endDate..."
New-MailboxExportRequest -Name "EmailLog$year$month" -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox $mailbox -FilePath "\ReadyNAS\backup\Mailboxes\EmailLog\EmailLog${year}-${month}.pst"
Write-Host "Done."


Write-Host -NoNewline "Waiting for export to complete..."
While(!(Get-MailboxExportRequest -Mailbox $mailbox -Name "EmailLog$year$month" -Status Completed))
{
    #Sleep for a  few minutes
    Write-Host -NoNewline "."
    Start-Sleep -s 60
}
Write-Host "Done."


Write-Host -NoNewline "Removing Export Request..."
Get-MailboxExportRequest -Mailbox $mailbox -Status Completed -Name "EmailLog$year$month" | Remove-MailboxExportRequest
Write-Host "Done."

E a saída:

Exporting items between 05/22/2013 00:00:00 and 06/01/2013 00:00:00...
Name            Mailbox       Status
----            -------       ------
EmailLog201305  Cylindric     Queued
Done.
Waiting for export to complete..........Done.

Isso parece estar exportando muito mais do que esses 10 dias. O PST parece conter TODOS os emails!

    
por Cylindric 29.05.2013 / 11:16

2 respostas

2

Use o cmdlet Get-Date !

O snippet abaixo irá verificar em que mês está, subtrair 1 e exportar todas as mensagens para o seu arquivo .pst

$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddMonths(-1)
$month = "{0:D2}" -f [int]$startDate.Month

# Convert dates to short date strings
$endDate = $endDate.ToShortDateString()
$startDate = $startDate.ToShortDateString()

New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox "MonitorMailbox" -FilePath "\Server\backup\EmailLog\MonitorMailbox 2013-${month}.pst"

while(!(Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed))
{
    #Sleep for a  few minutes
    Start-Sleep -s 300
}
Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed | Remove-MailboxExportRequest

Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:'${startDate}'..'${endDate}'" -DeleteContent

É simples executar isso uma vez por mês para receber os últimos meses de e-mails arquivados

    
por 29.05.2013 / 20:33
0

Se você estiver disposto a colocar isso em uma tarefa agendada, isso deve conseguir o que você está procurando:

$now=get-datetime
$fromtime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-2)
$totime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-1)
New-MailboxExportRequest -ContentFilter {(Received -ge $fromtime) -and (Received -lt $totime)} -Mailbox "MonitorMailbox" -FilePath "\Server\backup\EmailLog\MonitorMailbox "+$totime.year+"-"+$totime.month+"-"+$totime.day"+".pst"
$mailQuery="Received:"+fromtime.toString("d")+".."+$totime.toString("d")
Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery $mailQuery -DeleteContent

O que ele faz é aproveitar as funções de manipulação de data do Powershell. As variáveis $fromtime e $totime são primeiro zeradas para meia-noite e, em seguida, configuradas para uma distância de um dia. Em seguida, usamos essas variáveis na construção das consultas necessárias pelos cmdlets do Exchange.

    
por 29.05.2013 / 20:30