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
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.
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.
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
- 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.
- 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.
- 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 $ExchangeDB
comandos e canalizá-los para o resto da lógica, etc. Seria aqui que você definiria uma variável $ExchangeDB
e 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 -ContentFilter
parâ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 $Export
partes 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 $ExchangeDB
comando deve ser definido como uma variável e, em seguida, essa variável canalizada para as outras partes da$DynCMD
variável [comando dinâmico] ou há um problema com o pipeline simultâneo. - Use AMBOS
Received -ge
eSent -ge
com-or
em vez de-and
com o-ContentFilter
parâ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-Command
funcionaria, 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-Command
tem 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
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 PS1
arquivo foi criado com nome TempMBExport.ps1
e 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.ps1
script 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 $Exprot
com $Export
:
While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))