Скрипт Power Shell для экспорта почтового ящика

Скрипт Power Shell для экспорта почтового ящика

У меня есть скрипт, он работает и запрограммирован на создание резервной копии для каждого почтового ящика в течение месяца и сохранение ее на локальном общем диске. Когда я запускаю скрипт, он экспортирует всю базу данных вместо указанного диапазона дат. Я не программист. Я много искал в Google, но не на 100% успешно. Я хочу следующие изменения

  1. Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я попробовал "-Database Databasename" в скрипте, но он выдает ошибку.

  2. Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных для каждого месяца. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортировать с 9 ноября по 9 декабря 2015 года. Даты должны автоматически измениться в соответствии с датой компиляции.

  3. Нижняя часть скрипта не будет запущена там, где начинается ExportRequest.

Это сценарий.

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

После этого скрипта выдает ошибку. Но почтовые ящики экспортируются полными

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

Пожалуйста, помогите сделать этот скрипт идеальным. Спасибо

решение1

Экспорт почтовых ящиков Exchange из определенной базы данных Exchange и из определенного диапазона дат с помощью PowerShell в файлы PST с уникальными именами

  1. Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я попробовал "-Database Databasename" в скрипте, но он выдает ошибку.
  2. Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных для каждого месяца. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортировать с 9 ноября по 9 декабря 2015 года. Даты должны автоматически измениться в соответствии с датой компиляции.
  3. Нижняя часть скрипта не будет запущена там, где начинается ExportRequest.

Для вопроса №1.Похоже, вам просто нужно вставить команды Get-Mailbox -Database $ExchangeDB, а затем передать их по конвейеру остальной части логики и т. д. Это будет то, где вы устанавливаете переменную $ExchangeDBи устанавливаете ее на имя вашей базы данных Exchange. По какой-то причине вам приходится устанавливать эту команду как переменную, а затем передавать ее по конвейеру, или есть какая-то проблема с параллельным конвейером и т. д.

Для вопроса №2.Похоже, что переменная data -ContentFilterпо какой-то причине не очень хорошо работает с параметром со строкой даты, но это работает, если вы поместите дату за вычетом дней в переменную и объедините это как часть команды, а затем используете эту команду при ее выполнении.

Для вопроса №3.Похоже, Дэвид мог ответить на это, и это может быть просто опечатка в этой части, где у вас возникли проблемы. В противном случае, не стесняйтесь протестировать этот синтаксис в вашем цикле, чтобы увидеть, какие результаты вы получите, поскольку я не думаю, что вам нужны части -Mailbox $Exportв команде:

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

ПУНКТЫ ЗАМЕТОК ПО СЦЕНАРИЮ

  • Одна переменная даты задается с указанием количества дней, которые необходимо вычесть из текущей даты, $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")поскольку вы получите данные с этой даты по текущую дату.
  • Команду Get-Mailbox -Database $ExchangeDBнеобходимо задать как переменную, а затем передать эту переменную по конвейеру в другие части переменной [динамическая команда], $DynCMDиначе возникнет проблема с параллельной конвейеризацией.
  • Используйте BOTH Received -geи Sent -gewith -orвместо -andпараметра with -ContentFilter— это гарантирует, что вы получите и то, и другое с даты получения и отправки для элементов электронной почты в обоих направлениях.
  • Это превратилось в сложную задачу для меня, поэтому я просто сделал так, чтобы он динамически создавал скрипт PowerShell со всеми применимыми переменными и т. д., а затем выполнял этот скрипт. Скрипт помещается в %temp%местоположение переменных среды ОС Windows, и если он существует до запуска, он удаляет его, а затем создает его.

Примечание к выпуску

(Я думал, что это Invoke-Commandсработает, но у меня не хватило времени, поэтому мне было проще и гораздо более своевременно передать все в скрипт PowerShell со всеми применимыми переменными, установленными в соответствии с критериями, и просто выполнить его после этого. У есть Invoke-Commandпроблемы с переменными, объединенными с другими переменными, и построенными динамическими командами, поэтому это было просто и, как было подтверждено, работает так, как и ожидалось, для решения ваших проблем, за исключением пункта 3, в котором я все еще не уверен на 100%, поэтому предположим, что это опечатка, как предположил Дэвид, если толькоДля вопроса №3.(Предоставленный мной синтаксис разрешает.)


ПРИМЕР СКРИПТА POWERSHELL (КОНВЕЙЕРНЫЙ ЦИКЛ)

(Экспорт всех почтовых ящиков Exchange из определенной базы данных Exchange в общую папку в виде файлов PST, при этом имя файла будет псевдонимом учетной записи почтового ящика)

ПРИМЕЧАНИЕ:Вам нужно будет изменить две переменные в этом скрипте, чтобы они указывали на то, как настроена ваша среда.1. Имя базы данных Exchange[ $ExchangeDB = "<Exchange_DB_Name>"и2. UNC-путь, куда будут экспортированы PST-файлы[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] поэтому эти две переменные нужно изменить. После того, как они будут изменены, запустите из окна командной консоли PowerShell Exchange Server, как я это и протестировал, и подтвердил, что все работает так, как и ожидалось.

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

ПРИМЕР СКРИПТА POWERSHELL (ЦИКЛ 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"

Консоль управления Exchange Print и PowerShell

введите описание изображения здесь


Тестовый забег

Ниже приведено то, что вы можете вставить в консоль управления Exchange PowerShell для динамического построения временного скрипта PowerShell Windows при каждом запуске (при выполнении критериев соответствия). После того, как это будет выполнено в оболочке управления Exchange PowerShell на сервере Exchange, но не в PS, перейдите в Start--> Run--> и введите %Temp%и нажмите Enter.

Оттуда посмотрите, PS1создан ли файл с именем TempMBExport.ps1и откройте его с помощью Notepad и посмотрите на логику. Посмотрите, что произойдет, если вы скопируете то, что находится в этом скрипте, в консоль управления Exchange PowerShell и нажмете Enter.

Я не уверен, есть ли проблема в том, что файл не попадает в папку переменных среды Windows Temp, если он не существует, или у консоли PS нет доступа для его выполнения оттуда, или ваша версия Exchange не поддерживает одну из этих команд, поэтому начните с этого и посмотрим, что получится для устранения неполадок.

Приведенный ниже скрипт исключает эту & "$TempPSScript"часть, поэтому он НЕ выполняет динамически созданный и скомпилированный %temp%\TempMBExport.ps1скрипт, поэтому подтверждение его наличия в нужном месте и того, будет ли эта логика работать в консоли управления Exchange PS, является хорошим следующим шагом для выяснения проблемы.

Трудно устранять неполадки в письменном виде без доступа или удаленной поддержки, поэтому я немного ограничен здесь и должен, к сожалению, строить предположения. Не уверен, какие еще варианты у вас есть, но это некоторые быстрые мысли.

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

НАКОНЕЦ

Когда я запускаю PS, как я сказал выше, и открываю его с помощью блокнота, чтобы просто посмотреть логику, он строит его в этом формате с этим sytax, так что, возможно, попробуйте запустить это в вашей Exchange PS Management Shell и посмотрите, какие результаты вы получите. Если это работает таким образом, то проблема как-то связана с выполнением скрипта, но вы не получаете никаких ошибок, но, возможно, это также прольет свет на тему.

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

решение2

После этого скрипт выдает ошибку

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

Похоже, у вас орфографическая ошибка.

Заменить :$Exprot$Export

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

Связанный контент