PowerShell ile Exchange Online'a Geçiş


Bu serinin ilk bölümünde, PowerShell ile Posta Kutularını Exchange Online'a Geçirme - Bölüm 1'de, posta kutusu taşımalarına yönelik bir dizi ön kontrol denetimini içeren bir posta kutusu geçişine nasıl hazırlanacağımızı ele aldık. Şimdi posta kutularını Exchange Server'dan Exchange Online'a taşımak için PowerShell koduna geçiyoruz. Çeşitli Taşıma İsteği cmdlet'lerini ve bunları ana geçiş görevlerimizi gerçekleştirmek için nasıl kullanabileceğimizi inceleyeceğiz. Kod'a geçelim!

Operasyonlar

Bu bölümde, Exchange Online'a geçişlerini yönetirken bir posta kutusuyla gerçekleştirilebilecek çeşitli işlemleri hızlı bir şekilde ele alacağız. Bu eylemler, çalıştırmamız gereken PowerShell cmdlet'leri biçiminde yerleştirilecektir.

  • New-MoveRequest: Bir posta kutusunu Exchange Server'dan Exchange Online'a taşımak için ilk Taşıma İsteğini oluşturur.
  • Suspend-MoveRequest: Etkin olan bir taşıma işlemini askıya alır ve taşıma işlemini askıya alınmış veya duraklatılmış bir duruma getirir.
  • Set-MoveRequest: Bir Taşıma İsteğinin yapılandırılabilen bazı yönlerini değiştirir.
  • Remove-MoveRequest: Belirtilen taşıma isteğini siler ve taşınan tüm posta kutusu verileri temizlenir.
  • Get-MoveRequest: Belirtilen taşıma isteğini listeler.

Yeni Taşınma Talebi Oluşturma

Bir posta kutusunu Exchange Online'a taşırken Taşıma İsteği oluşturmak için ihtiyacınız olan birkaç şey vardır.

Öncelikle kimlik adını vereceğimiz posta kutusunun e-posta adresine ihtiyacımız var.

Daha sonra, taşımayı başlatmak ve verileri çekmek için Exchange Online için yerel Exchange Sunucularınıza açılan bir HTTPS bağlantı noktası olan Geçiş Uç Noktası'na ihtiyacımız var.

TargetDomain gereklidir, çünkü bu sizin kiracı alan adınızdır ve genellikle .onmicrosoft.com biçimindedir.

Exchange Online'ın bağlantı/geçiş bağlantısını oluşturabilmesi için Kimlik Bilgileri, bu durumda Active Directory Kimlik Bilgileriniz gereklidir.

Bir Taşıma İsteği oluştururken, taşıma işleminin tamamlanmasına izin verme veya tam senkronizasyon tamamlandığında askıya alınmasını sağlama seçeneğimiz de vardır. İkinci seçeneğin avantajı, belirli bir posta kutusu taşıma olayı için posta kutusu taşımalarını önceden aşamalandırabilmemizdir.

İlk eşitlemeden sonra, en son değişikliklerin Exchange Online'daki posta kutusu kopyasında mevcut olduğundan emin olmak için günde bir kez posta kutusu taşıma aşaması eşitlenir. Taşıma işlemini tamamlamaya hazır olduğumuzda, senkronize edilecek tek veri son senkronizasyondan bu yana gerçekleşen değişikliklerdir ve bunlar genellikle küçüktür ve tamamlama süreci daha hızlıdır. Bunun için New-MoveRequest cmdlet'inde 'SuspendWhenReadyToComplete' anahtarını kullanabiliriz.

Örnek bir Taşıma İsteği oluşturalım:

$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<tenant>.onmicrosoft.com"$OPCred = Get-Credentials

Tüm bu değişkenleri bir araya getirerek bir New-MoveRequest elde ederiz:

New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete -ErrorAction STOP

Değişkenlerin kullanılması aynı zamanda süreci ölçeklenebilir hale getirir; burada posta kutusu grupları bir CSV dosyasında Birincil SMTP Adreslerinin bir listesi olarak gruplandırılabilir. CSV'yi Foreach döngüsüyle döngülemek, CSV dosyasındaki posta kutularını taşımamız gerektiği kadar bu tek satırlık satırları çalıştırmamıza olanak tanır.

Taşıma İsteğini Tamamlama

Taşıma İsteklerini hazırlarken ve bir senkronizasyon (günlük veya ilk) tamamlandığında, posta kutusu için Taşıma İsteği askıya alınır. Taşıma işlemini tamamlamak ve posta kutularının tamamen Exchange Online'a aktarılmasını istiyorsak Taşıma İsteğini Sürdürmemiz gerekir. Bunu yapabilmemizin yolu Resume-MoveRequest cmdlet'ini kullanmaktır.

Özgeçmiş isteğinin tek satırı, Taşıma İsteği oluşturma aşamasında zaten yapılmış olduğundan çok daha basittir. Devam tek satırlık şuna benzer:

Resume-MoveRequest $Mailbox -Confirm:$False

Gerekli olan tek kriter, tamamlamak istediğimiz posta kutusunun Birincil SMTP Adresidir.

Taşıma Talebinin Askıya Alınması

Artık tüm posta kutusu hareketleri sorunsuz gitmiyor. Bazen Taşıma İstekleri çok fazla bant genişliği kaplar ve aslında bir şirketin WAN'ını veya İnternet bağlantısını, diğer projelerin veya ticari çıkarların etkileneceği noktaya kadar etkileyebilir. Peki, eğer posta kutusu taşımalarımız tüm hızıyla devam ediyorsa, etkiyi nasıl azaltabiliriz? Suspend-MoveRequest adında bir cmdlet'imiz var.

Askıya Alma isteğinin tek satırı, Taşıma İsteği oluşturma aşamasında zaten yapılmış olduğundan, çok daha basittir. Askıya alma tek astarı şuna benzer:

Suspend-MoveRequest $SMTPAddress -Confirm:$False

Gerekli olan tek kriter, tamamlamak istediğimiz posta kutusunun Birincil SMTP Adresidir.

Taşıma İsteğini Silme

Bazen posta kutusu Taşıma İsteklerinin kaldırılması gerekebilir. Bunun nedeni, bunların kazara oluşturulmuş olması veya bir kullanıcının diğer bağımlılıklar nedeniyle taşınmak istememesi olabilir veya bir geçiş kümesinden geri çekilmemiz ve ilgili tüm isteklerin kaldırılması gerekmesi olabilir. Bu nedenle, Microsoft'un bu senaryoları işlemek için bir Remove-MoveRequest cmdlet'i vardır. Cmdlet'i çalıştırdığımızda Taşıma İsteğini kaldırıyoruz ve arka uçta Microsoft, daha sonraki bir tarihte temizlenmek üzere senkronize edilen tüm verileri kaldırıyor.

Kaldırma İsteğinin tek satırı, Taşıma İsteği oluşturma aşamasında zaten yapılmış olduğundan, çok daha basittir. Tek astarı kaldır şuna benzer:

Remove-MoveRequest $SMTPAddress -Confirm:$False

Gerekli olan tek kriter, tamamlamak istediğimiz posta kutusunun Birincil SMTP Adresidir.

Geri Alma Planı

Geri çekilmek mi? Microsoft'un yarattığı tüm bu harika özelliklerin son kullanıcılarımızın kullanımına sunulması için tüm posta kutularımızın Exchange Online'da olmasını istemiyor muyuz? Elbette öyle, ama ya ciddi bir sorun gün yüzüne çıkarsa ya da Office 365 için ihtiyacımız olan desteğe sahip değilsek ya da BT alanında yeni bir lider (CIO'yu düşünün) geleceğin yolunun şirket içi ortam olduğuna karar verirse ne olur? … O halde bir çeşit geri çekilme planına ihtiyacımız var. Görevlerin çoğunda, Taşıma İsteği tamamlanmadıysa, Taşıma İsteğini basitçe durdurabilir veya askıya alabilir ve ardından bu Taşıma İsteğini silebiliriz. Bunu yaparken posta kutusunu şirket içinde bırakırız ve Exchange Online'a taşınmayız. Ancak posta kutusunu Exchange Online'a taşıdıysak ve geri taşımamız gerekirse ne olur?

Geri taşımak için neye ihtiyacımız var?

Şirket içi Exchange'e geri dönmek, Exchange Sunucularınız hakkında biraz ayrıntı ve bilgi gerektirir. Posta kutusunun SMTP Adresine, Exchange'e geri kopyalandığında posta kutusunu koyacağımız posta kutusu veritabanına, bağlanılacak bir Uç Noktaya (posta kutularını Exchange Online'a taşımak için kullandığımızın aynısı), bir hedef etki alanına (etki alanı) ihtiyacımız var. Birincil SMTP adresiniz işe yarayacaktır), şirket içi kimlik bilgileriniz ve işte bu kadar:

$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<yourdomain.com>"$Database = "<Database for mailbox>"$OpCred = Get-Credential

Ayrıca Exchange Online'ın, isteğin posta kutusunu Exchange Online'ın dışına gönderdiğini bilmesini sağlamak için bir Giden anahtarına da ihtiyacımız var.

New-MoveRequest -identity $Mailbox -OutBound -RemoteTargetDatabase $Database -RemoteHostName $Endpoint -RemoteCredential $OPCred -TargetDeliveryDomain $TargetDomain

Bazen bir bekletme posta kutusunun taşınmasını engelleyebileceğinden ve bu bekletmeyi kaldırmanız ve ardından posta kutusunu taşımanız gerekebileceğinden, bu konuda bazı uyarılar vardır. Aksi takdirde, Exchange Server'a geri taşıma işlemi, işin %95'e eşitleneceği ve tamamlanmanın başlatılmasını bekleyeceği ve tamamlanana kadar her gün eşitleneceği Exchange Online ile aynıdır.

Tek Kullanımlı Geçiş Gruplarına Dönüştürme

Tek seferde tek bir posta kutusu taşıma işlemini gerçekleştirmek bazen faydalı olabilir ancak PowerShell'i her zaman geniş ölçekte kullanmak daha iyidir. Aksi takdirde verimlilik kaybolur. Örneğin taşınması gereken yeni bir kullanıcı grubunu ele alalım. New-MoveRequest cmdlet'inin tek bir görevi gerçekleştirmek için nasıl kullanılabileceğini gördük. Bunu toplu kullanıma dönüştürmek için öncelikle PowerShell değişkenine aktarabileceğimiz bir CSV dosyasına ihtiyacımız var. Basit bir CSV dosyası şuna benzer:

PrimarySMTPAddressJohn.Doe@domain.comJane.Doe@domain.com

Taşıma İsteği bölümündeki değişkenleri alıp buna bir Read-Host tek satırlık ve bir Foreach döngüsü ekleyerek artık şu koda sahibiz:

$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<tenant>.onmicrosoft.com"$OPCred = Get-Credentials$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"$WaveCSV = Import-CSV $CSV
Foreach ($Line in $WaveCSV) {
$Mailbox = $Line.SMTPAddress
New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete}

Kodun bir uyarısı, hata kontrolü veya hata toplama işleminin olmamasıdır; bu, taşıma işlemi başarısız olursa sorunu belirlemek için ekrandan hata kodunu kopyalamamız gerekebileceği anlamına gelir. Ayrıca, iyi ve kötü denemelerin kayıtları da sağlanmaz. Bu nedenle, bu kod, posta kutularının Exchange Online'a toplu taşınması/senkronizasyonu gerçekleştirmenin hızlı bir yoludur. Benzer şekilde bu kod çerçevesi, posta kutusu geçişlerinin askıya alınması, devam ettirilmesi ve silinmesi için kullanılabilir. Doğru işlemle eşleşen Foreach döngüsüne tek satırlık bir satır eklemeniz yeterlidir.

Raporlama

Posta kutularını Exchange Online'a taşırken, bu geçişlerin iyi bir hızda ilerlemesini, fazla kısıtlanmamasını ve zamanında tamamlanmasını sağlamak için bu geçişlerin izlenmesi kritik öneme sahiptir. Raporları çalıştırmak ve analiz amacıyla kullanılabilecek CSV formatlı bir dosyada raporlama oluşturmak için PowerShell'i kullanabiliriz. Bunun için birkaç cmdlet'in bir arada bulunmasına ihtiyacımız var: Get-MoveRequest ve Get-MoveRequestStatistics. Birlikte, geçişlerimizin nasıl ilerlediğini görmek için bunu çalıştırabiliriz:

Get-MoveRequest | Get-MoveRequestStatistics -ErrorAction STOP | ft DisplayName,Status,PercentComplete

Bu tek satırlık yazıyla, posta kutusu adının, taşıma durumunun ve taşıma işleminin şu ana kadar yüzde kaçının tamamlandığının görüntülenmesiyle tüm taşımalarımızda ilerleme hissi elde edeceğiz. Aynı tek satırlık istatistik çıktısını bir CSV dosyasına göndermek için de gönderilebilir:

$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"$Row = "DisplayName,Status,PercentComplete" = Out-File $DestinationFileForeach ($Line in $CSV) {$Move = Get-MoveRequestStatistics -Identity $Mailbox | Select DisplayName,Status,PercentComplete$DisplayName = $Move.DisplayName$Status = $Move.Status$PercentComplete = $Move.PercentComplete$Row = "$DisplayName,$Status,$PercentComplete"$Row = Out-File $DestinationFile -Append}

CSV Uyarıları

Unutulmaması gereken bir nokta, CSV aracılığıyla herhangi bir Taşıma İsteği ile çalışırken CSV dosyasının kesin bir sınır olmadığıdır. Bir taşıma işleminin bir CSV dosyası kullanılarak oluşturulmuş olması, Taşıma İsteğinin başka biri tarafından askıya alınamayacağı, silinemeyeceği, devam ettirilemeyeceği veya rapor edilemeyeceği anlamına gelmez. Başka bir deyişle, oluşturma sırasında bir CSV dosyasında 25 ad varsa, yönetilecek 15 veya belki 50 adla yepyeni bir CSV dosyası oluşturabiliriz. Her Taşıma İsteği birbirinden tamamen bağımsızdır. Bu yüzden gerektiği gibi ayarlamalar yapın, çünkü yapacaksınız.

Çözüm

Posta kutularını Exchange Online'a geçirmeyle ilgili bu makale dizisinde, PowerShell aracılığıyla gerçekleştirilebilecek çeşitli önkoşulların yanı sıra posta kutusu taşıma işlemlerini de araştırdık.

Geçersiz SMTP etki alanları gibi olası engellerin yanı sıra bir posta kutusu Exchange Online'a taşındığında dikkat edilmesi gereken ilkelere de baktık. Taşıma İstekleri açısından oluşturma, askıya alma, devam ettirme, tamamlama ve hatta şirket içi Exchange Server'a geri dönme konularını inceledik.

Açık olması gereken şey, kapsamlı bir betiğin kapsanacak çok fazla alana sahip olacağıdır, ancak bunların hepsi PowerShell'de yapılabilir. Ayrıntılı komut dosyası günlüğünü (muhtemelen gelecekteki bir blog makalesi?), posta kutusu hareketlerinin raporlanmasını özelleştirmeyi ve daha fazlasını içerecek şekilde kodlamayı daha da özelleştirebiliriz. PowerShell, toplu görevlerin üstesinden gelmek için harika bir araç sağlar ve tüm bu hareketleri GUI'de oluşturma zahmetinden bize zaman kazandırır.

İlgili makaleler