Power Shell Script para exportar buzones de correo

Power Shell Script para exportar buzones de correo

Tengo un script que está funcionando y está programado para realizar una copia de seguridad de cada buzón durante un mes y almacenarlo en una unidad compartida local. Cuando ejecuto el script, exporta la base de datos completa en lugar del rango de fechas especificado. No soy programador. Busqué mucho en Google pero no tuve éxito al 100%. Quiero las siguientes modificaciones

  1. Quiero que esa secuencia de comandos exporte el buzón solo desde una base de datos específica, no desde todas las bases de datos. Intenté "-Database Nombre de la base de datos" en el script pero aparece un error.

  2. El script debe exportar todos los buzones de la base de datos mencionada anteriormente para cada mes. Digamos que si ejecuta este script el 9 de diciembre de 2015, debería exportarse del 9 de noviembre al 9 de diciembre de 2015. Las fechas deben cambiarse automáticamente según la fecha de compilación.

  3. La parte inferior del script no se ejecutará donde comienza ExportRequest.

Este es el guión

$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..."

Después de que este script dé error. Pero los buzones se exportan completos.

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 ayuda a que este script sea perfecto. Gracias

Respuesta1

Exporte buzones de correo de Exchange desde una base de datos de Exchange particular y desde un rango de fechas particular con PowerShell a archivos PST con nombres únicos

  1. Quiero que esa secuencia de comandos exporte el buzón solo desde una base de datos específica, no desde todas las bases de datos. Intenté "-Database Nombre de la base de datos" en el script pero aparece un error.
  2. El script debe exportar todos los buzones de la base de datos mencionada anteriormente para cada mes. Digamos que si ejecuta este script el 9 de diciembre de 2015, debería exportarse del 9 de noviembre al 9 de diciembre de 2015. Las fechas deben cambiarse automáticamente según la fecha de compilación.
  3. La parte inferior del script no se ejecutará donde comienza ExportRequest.

Para la pregunta n.° 1.Parece que solo necesita ingresar los Get-Mailbox -Database $ExchangeDBcomandos y luego canalizarlos al resto de la lógica, etc. Aquí sería donde configuraría una variable $ExchangeDBy la configuraría con el nombre de su base de datos Exchange. Por alguna razón, debe configurar este comando como una variable y luego canalizarlo o habrá algún problema con la canalización simultánea, etc.

Para la pregunta n.° 2.Parece que la variable de datos no se lleva bien con el -ContentFilterparámetro con la cadena de fecha por alguna razón, pero sí si pones la fecha menos los días en una variable, la concatenas como parte de un comando y luego usas ese comando. cuando se ejecuta.

Para la pregunta n.° 3.Parece que David pudo haber respondido esto y puede que simplemente sea un problema tipográfico en esta parte en la que tienes problemas. De lo contrario, siéntete libre de probar con esta sintaxis en tu bucle para ver qué resultados obtienes, ya que no creo que necesites las -Mailbox $Exportpartes del comando:

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

PUNTOS DE NOTA DEL GUIÓN

  • Una variable de fecha configurada con la cantidad de días que se restarán de la fecha actual, $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")ya que obtendrá los datos desde esa fecha hasta la fecha actual.
  • El Get-Mailbox -Database $ExchangeDBcomando debe configurarse como una variable y luego esa variable debe canalizarse a las otras partes de la $DynCMDvariable [comando dinámico] o hay un problema con la canalización simultánea.
  • Utilice AMBOS Received -gey Sent -gecon -oren lugar de -andcon el -ContentFilterparámetro; esto garantiza que obtendrá ambos desde la fecha de recepción y envío de los elementos de correo electrónico en ambas direcciones.
  • Esto se convirtió en una gran tarea para mí, así que terminé haciéndolo para que cree dinámicamente un script de PowerShell con todas las variables aplicables, etc. configuradas y luego ejecute ese script. El script se coloca en la %temp%ubicación de la variable ambiental del sistema operativo Windows y, si existe antes de ejecutarse, lo elimina y luego lo compila.

Nota temática

(Pensé que Invoke-Commandfuncionaría, pero se me acabó el tiempo, por lo que fue más fácil y mucho más oportuno para mí canalizar todo a un script de PowerShell con todas las variables aplicables establecidas según los criterios, y simplemente ejecutarlo después. Tiene Invoke-Commandproblemas con las variables concatenado a otras variables y comandos dinámicos integrados, por lo que esto fue simple y se confirmó que funciona como se esperaba para resolver sus problemas, aparte del número 3, del cual todavía no estoy 100% seguro del problema allí exactamente, por lo que suponiendo el error tipográfico como sugirió David a menos que elPara la pregunta n.° 3.la sintaxis que proporcioné resuelve.)


GUIÓN DE EJEMPLO DE POWERSHELL (BUCLE DE TUBERÍA)

(Exporte todos los buzones de Exchange desde una base de datos de Exchange particular a un recurso compartido de archivos en archivos PST con el nombre del archivo como el nombre de alias de la cuenta del buzón)

NOTA:Necesitará cambiar dos variables en este script para indicar con qué está configurado su entorno.1. el nombre de la base de datos de Exchange[ $ExchangeDB = "<Exchange_DB_Name>"y2. la ruta UNC donde se exportarán los archivos PST[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] por lo que esas dos variables deben cambiarse. Una vez que se cambien, ejecútelo desde la ventana de la consola de comandos de Exchange Server PowerShell, así es como lo probé y confirmé que funcionó como se esperaba.

$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"

GUIÓN DE EJEMPLO DE POWERSHELL (BUCLE FOREACH)

$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"

Impresión de pantalla Consola de administración de Exchange y consola PowerShell

ingrese la descripción de la imagen aquí


Prueba de funcionamiento

A continuación se muestra lo que puede pegar en la consola de administración de Exchange PowerShell para crear el script temporal de PowerShell de Windows dinámicamente por ejecución (cuando se cumplan los criterios de finalización). Una vez que esto se ejecute en el Shell de administración de Exchange PowerShell, en Exchange Server pero no en PS, vaya a Start--> Run-->, escriba %Temp%y presione Enter.

Desde allí, vea si el PS1archivo se crea con nombre TempMBExport.ps1, ábralo con el Bloc de notas y observe la lógica. Vea lo que sucede si copia el contenido de ese script en la consola de administración de Exchange PowerShell y presiona Enter.

No estoy seguro de si hay un problema con que esto no vaya a la carpeta de variables ambientales temporales de Windows si el archivo no existe o si la consola PS no tiene acceso para ejecutarlo desde allí o si a su versión de Exchange no le gusta uno. de esos comandos, así que comience con esto y veamos qué sucede para solucionar el problema.

El siguiente script excluye la & "$TempPSScript"parte, por lo que NO ejecuta el %temp%\TempMBExport.ps1script compilado y creado dinámicamente, por lo que confirmar que está en la ubicación y si esta lógica se ejecutará o no en la consola de administración de Exchange PS es un buen siguiente paso para resolver el problema.

Es difícil solucionar problemas por escrito sin acceso o soporte remoto, por lo que estoy un poco limitado aquí y desafortunadamente tengo que especular. No estoy seguro de qué otras opciones tendría, pero esas son algunas ideas 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

Cuando ejecuto el PS como dije anteriormente y lo abro con el bloc de notas solo para ver la lógica, lo construye en este formato con esta sintaxis, así que tal vez intente ejecutar esto en su Shell de administración de PS de Exchange y vea qué resultados obtiene. Si funciona de esta manera, entonces el problema tiene algo que ver con la ejecución del script, pero no recibe ningún error, pero tal vez esto también arroje algo de luz sobre el tema.

$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"}

Respuesta2

Después de esto, el script da un error.

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

Parece que tienes un error de ortografía.

Reemplazar $Exprotcon $Export:

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

información relacionada