Skrypt PowerShell do eksportowania skrzynki pocztowej

4

Mam skrypt, który działa i jest zaprogramowany do wykonywania kopii zapasowej każdej skrzynki pocztowej przez miesiąc i zapisywania jej na lokalnym dysku udostępnionym. Po uruchomieniu skryptu eksportuje całą bazę danych zamiast określonego zakresu dat. Nie jestem programistą. Przeszukałem partię Google, ale nie udało się w 100%. Chcę następujące modyfikacje

  1. Chcę, aby ten skrypt eksportował skrzynki pocztowe tylko z określonej bazy danych, a nie ze wszystkich baz danych. Próbowałem "-Database Databasename" w skrypcie, ale daje błąd.

  2. Skrypt powinien eksportować wszystkie skrzynki pocztowe z wyżej wymienionej bazy danych za każdy miesiąc. Powiedz, jeśli uruchomisz ten skrypt 9 grudnia 2015 r., Powinien on zostać wyeksportowany od 9 listopada do 9 grudnia 2015. Daty muszą zostać zmienione automatycznie zgodnie z datą kompilacji.

  3. Dolna część skryptu nie uruchomi się, gdy status żądania eksportu.

To jest skrypt

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

Po tym skrypcie pojawia się błąd. Ale skrzynki pocztowe są eksportowane w całości

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

Pomóż ulepszyć ten skrypt. Dzięki

Paramjot Singh
źródło
Paramjot - Każda szansa Akceptowanie odpowiedzi na jednej z poniższych odpowiedzi, gdy masz szansę?
Pimp Juice IT

Odpowiedzi:

2

Eksportuj skrzynki pocztowe Exchange z określonej bazy danych Exchange iz określonego zakresu dat za pomocą PowerShell do plików PST z unikalnymi nazwami

  1. Chcę, aby ten skrypt eksportował skrzynkę pocztową tylko z określonej bazy danych   ze wszystkich baz danych. Próbowałem „-Database Databasename” w skrypcie   ale to daje błąd.
  2. Skrypt powinien eksportować wszystkie skrzynki pocztowe z wyżej wymienionej bazy danych dla   każdego miesiąca. Powiedz Jeśli uruchom ten skrypt 9 grudnia 2015 r. Powinien wyeksportować   od 9 listopada do 9 grudnia 2015. Daty muszą zostać zmienione automatycznie   według daty kompilacji.
  3. Dolna część skryptu nie uruchomi się, gdy status żądania eksportu.

Na pytanie nr 1. Wygląda na to, że musisz tylko wpisać Get-Mailbox -Database $ExchangeDB polecenia, a następnie potokuj to do reszty logiki, itp. To by było, gdy ustawiłeś zmienną $ExchangeDB i ustaw ją na nazwę Exchange DB. Z jakiegoś powodu musisz ustawić tę komendę jako zmienną, a następnie ją potokować lub jest jakiś problem z jednoczesnym potokowaniem itd.

Na pytanie nr 2. Wydaje się, że zmienna danych nie radzi sobie dobrze z -ContentFilter Parametr z łańcuchem daty z jakiegoś powodu, ale robi to, jeśli umieścisz datę minus dni w zmiennej i złączysz ją jako część polecenia, a następnie użyjesz tego polecenia, gdy zostanie wykonane.

Na pytanie nr 3. Wygląda na to, że David odpowiedział na to pytanie i może to być literówka w tej części, w której masz problemy. W przeciwnym razie możesz przetestować tę składnię w pętli, aby zobaczyć, jakie wyniki uzyskasz, ponieważ nie sądzę, że potrzebujesz -Mailbox $Export części w poleceniu:

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

PUNKTY PAMIĘCI SCRIPT

  • Zmienna o jednej dacie ustawiona liczbą dni do odjęcia od bieżącej daty $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy") ponieważ otrzymasz dane z tej daty do bieżącej daty.
  • The Get-Mailbox -Database $ExchangeDB komenda musi być ustawiona jako zmienna, a następnie ta zmienna jest przesyłana do innych części [komendy dynamicznej] $DynCMD zmienna lub występuje problem z jednoczesnym potokowaniem.
  • Użyj obu Received -ge i Sent -ge z -or zamiast -and z -ContentFilter parametr - zapewnia to, że otrzymasz zarówno datę otrzymania, jak i wysłaną dla wiadomości e-mail w obu kierunkach.
  • Stało się to dla mnie dość dużym zadaniem, więc skończyło się na tym, że dynamicznie buduje skrypt PowerShell ze wszystkimi właściwymi zmiennymi itp., A następnie wykonuje ten skrypt. Skrypt jest wstawiany do %temp% Zmienna środowiskowa systemu operacyjnego Windows i jeśli istnieje przed uruchomieniem, usuwa ją, a następnie buduje.

Uwaga do wydania

(Myślałem Invoke-Command zadziałałoby, ale zabrakło mi czasu, więc łatwiej i szybciej mogłem przekazać wszystko do skryptu PowerShell ze wszystkimi odpowiednimi zmiennymi ustawionymi zgodnie z kryteriami i po prostu wykonać go później. The Invoke-Command ma problemy ze zmiennymi połączonymi z innymi zmiennymi i tworzy dynamiczne komendy, więc to było proste i potwierdzone, aby działać zgodnie z oczekiwaniami, aby rozwiązać twoje problemy, inne niż # 3, które nadal nie są w 100% pewne tego problemu dokładnie tak, zakładając, że literówka, jak sugerował David, chyba że Na pytanie nr 3. podana przeze mnie składnia rozwiązuje.)


PRZYKŁAD POWERSHELL PRZYKŁAD (PIPELINE LOOP)

(Eksportuj wszystkie skrzynki pocztowe programu Exchange z określonej bazy danych Exchange do udziału plików w plikach PST z nazwą pliku będącą nazwą aliasu konta skrzynki pocztowej)

UWAGA: Będziesz musiał zmienić dwie zmienne w tym skrypcie, aby wskazać, z czym jest skonfigurowane twoje środowisko 1. nazwa Exchange DB [ $ExchangeDB = "<Exchange_DB_Name>" i 2. ścieżka UNC, do której mają być eksportowane pliki PST [ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>" ] więc te dwie zmienne muszą zostać zmienione. Gdy zostaną one zmienione, uruchom je z okna konsoli programu Exchange Server PowerShell, tak jak je przetestowałem i potwierdziłem, że działa zgodnie z oczekiwaniami.

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

PRZYKŁAD POWERSHELL PRZYKŁAD (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"

Print Print Exchange Management Console i PowerShell Console

enter image description here


Testowe uruchomienie

Poniżej możesz wkleić do konsoli Exchange PowerShell Management, aby dynamicznie budować skrypt Windows PowerShell dla każdego uruchomienia (przy spełnieniu kryteriów spotkania). Po uruchomieniu w powłoce Exchange PowerShell Management Shell, na serwerze Exchange, ale nie w PS, przejdź do Start - & gt; Run - & gt; i wpisz %Temp% i naciśnij Wchodzić .

Stamtąd sprawdź, czy PS1 plik został nazwany TempMBExport.ps1 i otwórz go za pomocą Notatnika i spójrz na logikę. Zobacz, co się stanie, jeśli skopiujesz zawartość tego skryptu do konsoli Exchange PowerShell Management i wciśniesz Wchodzić .

Nie jestem pewien, czy istnieje problem z tym, że nie przechodzę do folderu zmiennych środowiskowych Windows Temp, jeśli plik nie istnieje lub konsola PS nie ma dostępu do wykonania z tego miejsca lub jeśli Twoja wersja Exchange nie lubi z tych poleceń zacznij od tego i zobaczmy, co się stanie, aby rozwiązać problem.

Poniższy skrypt wyklucza & "$TempPSScript" część więc NIE wykonuje dynamicznie zbudowanego i kompilowanego %temp%\TempMBExport.ps1 skrypt potwierdzający, że znajduje się w lokalizacji i czy ta logika będzie uruchamiana w konsoli Exchange PS Management to dobry następny krok do rozwiązania problemu.

Trudno jest rozwiązać problem na piśmie bez dostępu lub zdalnie, więc jestem trochę ograniczony i muszę niestety spekulować. Nie jestem pewien, jakie dalsze opcje masz, ale są to szybkie myśli.

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

W KOŃCU

Kiedy uruchamiam PS tak, jak powiedziałem powyżej i otwieram go za pomocą notatnika, aby zobaczyć logikę, buduje go w tym formacie za pomocą tego sytaxu, więc może spróbuj uruchomić to w powłoce zarządzania PS Exchange i zobaczyć, jakie wyniki uzyskasz. Jeśli działa w ten sposób, problem ma związek z wykonaniem skryptu, ale nie ma żadnych błędów, ale może to również rzucić nieco światła na ten temat.

$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"}
Pimp Juice IT
źródło
1

Po tym skrypt wyświetla błąd

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

Wygląda na to, że masz błąd ortograficzny.

Zastąpić $Exprot z $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))
DavidPostill
źródło
& lt; wzrusz ramionami & gt; Przynajmniej mógłbym naprawić oczywisty błąd. Naprawdę nie znam PS zbyt dobrze. Więc nie mogę naprawić twoich innych błędów.
DavidPostill