Power Shell Script para exportar caixa de correio

Power Shell Script para exportar caixa de correio

Eu tenho um script que está funcionando e está programado para fazer backup de todas as caixas de correio por um mês e armazená-las em uma unidade compartilhada local. Quando executo o script, ele exporta todo o banco de dados em vez do intervalo de datas especificado. Eu não sou um programador. Pesquisei muito no Google, mas não tive 100% de sucesso. Quero as seguintes modificações

  1. Quero que esse script exporte a caixa de correio apenas de um banco de dados específico e não de todos os bancos de dados. Tentei "-Database Databasename" no script mas deu erro.

  2. O script deve exportar todas as caixas de correio do banco de dados mencionado acima para cada mês. Digamos que se executar este script em 9 de dezembro de 2015, ele deverá exportar de 9 de novembro a 9 de dezembro de 2015. As datas devem ser alteradas automaticamente de acordo com a data de compilação.

  3. A parte inferior do script não será executada onde ExportRequest é iniciado.

Este é o roteiro

$Export = Get-Mailbox

$endDate = Get-Date "00:00:00"

$startDate = $endDate.AddDays(-30)

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

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

Write-Host -NoNewline "Exporting items between $startDate and $endDate..."

$Export|%{$_|New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -FilePath "\\FileServer\EmailBackups\ExportTest\Test\$($_.alias).pst"}

Write-Host "Done."

Write-Host -NoNewline "Waiting for export to complete..."

Depois que este script dá erro. Mas as caixas de correio são exportadas completas

While(!(Get-MailboxExportRequest -Mailbox $Exprot -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 $Export -Status Completed | Remove-MailboxExportRequest

Write-Host "Done."

Por favor, ajude a tornar este script perfeito. Obrigado

Responder1

Exporte caixas de correio do Exchange de um banco de dados específico do Exchange e de um intervalo de datas específico com o PowerShell para arquivos PST com nomes exclusivos

  1. Quero que esse script exporte a caixa de correio apenas de um banco de dados específico e não de todos os bancos de dados. Tentei "-Database Databasename" no script mas deu erro.
  2. O script deve exportar todas as caixas de correio do banco de dados mencionado acima para cada mês. Digamos que se executar este script em 9 de dezembro de 2015, ele deverá exportar de 9 de novembro a 9 de dezembro de 2015. As datas devem ser alteradas automaticamente de acordo com a data de compilação.
  3. A parte inferior do script não será executada onde ExportRequest é iniciado.

Para a pergunta nº 1.Parece que você só precisa inserir os Get-Mailbox -Database $ExchangeDBcomandos e canalizá-los para o resto da lógica, etc. Seria aqui que você definiria uma variável $ExchangeDBe a definiria como o nome do seu banco de dados do Exchange. Por algum motivo, você deve definir este comando como uma variável e, em seguida, canalizá-lo ou há algum problema com o pipeline simultâneo, etc.

Para a pergunta nº 2.Parece que a variável de dados não combina bem com o -ContentFilterparâmetro com a string de data por algum motivo, mas funciona se você colocar a data menos os dias em uma variável e concatenar isso como parte de um comando e depois usar esse comando quando for executado.

Para a pergunta nº 3.Parece que David pode ter respondido isso e pode ser apenas um problema de digitação nesta parte em que você está tendo problemas. Caso contrário, sinta-se à vontade para testar esta sintaxe em seu loop para ver quais resultados você obtém, pois não acho que você precise das -Mailbox $Exportpartes do comando:

Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false

PONTOS DE NOTA DO SCRIPT

  • Uma variável de data definida com o número de dias a serem subtraídos da data atual, $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")pois você obterá os dados dessa data até a data atual.
  • O Get-Mailbox -Database $ExchangeDBcomando deve ser definido como uma variável e, em seguida, essa variável canalizada para as outras partes da $DynCMDvariável [comando dinâmico] ou há um problema com o pipeline simultâneo.
  • Use AMBOS Received -gee Sent -gecom -orem vez de -andcom o -ContentFilterparâmetro — isso garante que você obtenha ambos desde a data de recebimento e envio para itens de e-mail em ambas as direções.
  • Isso se tornou uma tarefa e tanto para mim, então acabei fazendo com que ele criasse dinamicamente um script do PowerShell com todas as variáveis ​​​​aplicáveis, etc., definidas e depois executasse esse script. O script é colocado no %temp%local da variável ambiental do sistema operacional Windows e, se existir antes de ser executado, ele o exclui e o cria.

Nota de problema

(Achei que Invoke-Commandfuncionaria, mas fiquei sem tempo, então foi mais fácil e muito mais oportuno transferir tudo para um script do PowerShell com todas as variáveis ​​aplicáveis ​​definidas de acordo com os critérios e apenas executá-lo depois. O Invoke-Commandtem problemas com variáveis concatenado a outras variáveis ​​​​e construído comandos dinâmicos, então isso foi simples e confirmado para funcionar conforme o esperado para resolver seus problemas, exceto o número 3, que ainda não tenho 100% de certeza do problema exatamente, então assumindo o erro de digitação como David sugeriu a menos quePara a pergunta nº 3.sintaxe que forneci resolve.)


EXEMPLO DE SCRIPT DO POWERSHELL (PIPELINE LOOP)

(Exporte todas as caixas de correio do Exchange de um banco de dados específico do Exchange para um compartilhamento de arquivos em arquivos PST com o nome do arquivo sendo o nome alternativo da conta da caixa de correio)

OBSERVAÇÃO:Você precisará alterar duas variáveis ​​neste script para apontar para o que seu ambiente está configurado1. o nome do banco de dados do Exchange[ $ExchangeDB = "<Exchange_DB_Name>"e2. o caminho UNC para onde os arquivos PST serão exportados[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] então essas duas variáveis ​​precisam ser alteradas. Depois que eles forem alterados, execute a partir da janela do console de comando do Exchange Server PowerShell, que foi como testei e confirmei que funcionou conforme o esperado.

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD       = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"

 & "$TempPSScript"

EXEMPLO DE SCRIPT DO POWERSHELL (FOREACH LOOP)

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD1      = 'ForEach ($u in (Get-Mailbox -database ' + $ExchangeDB + ')) {'
$DynCMD2      = 'New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -Mailbox $u -FilePath "' + $ExportDir + '\$($u.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

$DynCMD1 | Out-File -Append -Force "$TempPSScript"
$DynCMD2 | Out-File -Append -Force "$TempPSScript"

 & "$TempPSScript"

Impressão de tela do console de gerenciamento do Exchange e do console do PowerShell

insira a descrição da imagem aqui


Execução de teste

Abaixo está o que você pode colar no console de gerenciamento do Exchange PowerShell para criar o script temporário do PowerShell do Windows dinamicamente por execução (de acordo com os critérios de conformidade). Depois que isso for executado no Exchange PowerShell Management Shell, no Exchange Server, mas não no PS, vá para Start-> Run-> e digite %Temp%e pressione Enter.

A partir daí veja se o PS1arquivo foi criado com nome TempMBExport.ps1e abra-o com o Bloco de Notas e veja a lógica. Veja o que acontece se você copiar o conteúdo desse script no console de gerenciamento do Exchange PowerShell e pressionar Enter.

Não tenho certeza se há um problema com isso não ir para a pasta de variáveis ​​​​ambientais Temp do Windows se o arquivo não existir ou se o console PS não tiver acesso para executá-lo a partir daí ou se a sua versão do Exchange não gostar de um desses comandos, então comece com isso e vamos ver o que acontece para solucionar o problema.

O script abaixo exclui a & "$TempPSScript"parte, portanto NÃO executa o %temp%\TempMBExport.ps1script compilado e compilado dinamicamente, portanto, confirmar se está no local e se essa lógica será executada ou não no console de gerenciamento do Exchange PS é uma boa próxima etapa para descobrir o problema.

É difícil solucionar problemas por escrito sem acesso ou suporte remoto, por isso estou um pouco limitado aqui e, infelizmente, tenho que especular. Não tenho certeza de quais outras opções você teria, mas essas são algumas reflexões rápidas.

$TempDir      = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB   = "Mail04-Original"
$ExportDir    = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate     = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD       = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'

If (Test-Path $TempPSScript){
    Remove-Item $TempPSScript
}

'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"

POR ÚLTIMO

Quando executo o PS como afirmei acima e o abro com o bloco de notas apenas para ver a lógica, ele o constrói neste formato com esta sintaxe, então talvez tente executar isso em seu Shell de gerenciamento PS do Exchange e veja quais resultados você obtém. Se funcionar dessa maneira, o problema tem algo a ver com a execução do script, mas você não está recebendo nenhum erro, mas talvez isso também esclareça o assunto.

$GetMBCMD = Get-Mailbox -Database Mail04-Original
$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "11/12/2015 00:00:00") -or (Sent -ge "11/12/2015 00:00:00")} -FilePath "\\FileServer\Emailbackups\ExportTest\MonthTest2\$($_.alias).pst"}

Responder2

Depois disso o script dá um erro

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))

Parece que você cometeu um erro de ortografia.

Substituir $Exprotcom $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))

informação relacionada