Exchange Online ile Azure Otomasyonu Yönetilen Kimlik kullanın


Exchange Online ve Azure Otomasyonu

15 Şubat 2024'te güncellendi

Önceki bir makalede, Microsoft Teams ve Microsoft Graph PowerShell SDK modüllerinin Azure Otomasyonu yönetilen kimliklerle nasıl kullanılacağını araştırıyorum. O zamanlar Exchange Online'ın yönetilen kimlikleri desteklemediğini belirtmiştim. Microsoft, Exchange Online Management modülünün Yönetilen Kimlikler desteğiyle tamamlanan V3.0'ını yayımladığında sorun ortadan kalktı. Yönetilen bir kimlikle Exchange Online'a bağlanmak, bağlanılacak kuruluşun belirtilmesini gerektirir ve hepsi bu kadar.

Connect-ExchangeOnline -ManagedIdentity -Organization office365itpros.onmicrosoft.com

Yönetilen kimliğe ait olan hizmet sorumlusunun, Exchange Online yönetim eylemlerini gerçekleştirmek için izne ihtiyacı vardır. New-UnifiedGroup cmdlet'iyle yeni bir Microsoft 365 grubu oluşturmanın mümkün olmadığını belirttim. Bu geçici bir aksaklık olabilir veya bu cmdlet henüz yönetilen bir kimlikle çalışamıyor olabilir.

Güncelleme: Azure Otomasyonu ile Exchange Online'a bağlanmak için her zaman Exchange Online yönetim modülünün en son sürümünü (V3.0 veya üstü) kullanın. Aşağıda açıklanan yöntemler artık yalnızca tarihsel açıdan ilgi çekicidir. Daha fazla bilgi için Microsoft belgelerine bakın. Microsoft, bazı Microsoft 365 grup yönetimi cmdlet'lerini yönetilen bir kimlikle kimlik doğrulaması yaptıktan sonra Azure Otomasyonu ile çalışacak şekilde henüz yükseltmedi. Bu cmdlet'lerin işlevleri, Microsoft Graph PowerShell SDK veya Graph API isteklerinden gelen cmdlet'lerle değiştirilebilir.

Exchange PowerShell V1 ile Yönetilen Kimlikleri Kullanma

Microsoft'un bir üretim modülü sunmasını beklerken, eski V1 Exchange modülünü yönetilen bir kimlikle kullanmak mümkündür. MVP Vasil Michev blogunda bunun nasıl yapılacağını anlatıyor. Daha ileri gitmeden önce Microsoft'un bu yöntemi de desteklemediğini söylemek önemli. Çalışıyor ancak üretimde kullanıyorsanız, işler ters giderse Microsoft desteğini arayabileceğinizi beklemeyin.

Süreçteki önemli adım, kullanmayı seçtiğiniz yönetilen kimliğin hizmet sorumlusuna Exchange'i Uygulama Olarak Yönet rolünü atamaktır. Bu şu şekilde yapılır:

  • Exchange yönetimi için kayıtlı Microsoft kurumsal uygulamasının ayrıntıları alınıyor.
  • Exchange yönetim uygulaması için tanımlanan roller kümesinden Exchange'i Uygulama Olarak Yönet rolü için izin tanımlayıcısı getiriliyor.
  • Yönetilen kimliğe ilişkin hizmet sorumlusuna Exchange'i Uygulama Olarak Yönet rolünü atamak için bilgileri kullanma.

Bir kez daha, PowerShell atamayı yapmanın tek yoludur. İşte kullandığım kod:

$ExoApp = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"
$AppPermission = $ExoApp.AppRoles | Where-Object {$_.DisplayName -eq "Manage Exchange As Application"}

$AppRoleAssignment = @{
    "PrincipalId" = $ManagedIdentityApp.Id
    "ResourceId" = $ExoApp.Id
    "AppRoleId" = $AppPermission.Id
  }
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $ManagedIdentityApp.Id -BodyParameter $AppRoleAssignment

Hizmet sorumlusu, Exchange yöneticisi olarak hareket etmesine izin veren rolü üstlendiğinde onu çalıştırabiliriz. Bu kod, kimlik için oluşturulan bir erişim belirtecini (OAuthUser@ artı kiracı tanımlayıcısını (OAuthUser@a662313f-14fc-43a2-9a7a-d2e27f4f3478) kullanarak) kullanarak Exchange Online'da oturum açmak için yönetilen kimliği kullanmanın bir örneğidir. ) Bağlandıktan sonra, tüm kullanıcı posta kutularını bulmak ve bazı posta kutusu istatistiklerini döndürmek için bazı standart Exchange PowerShell kodunu çalıştırıyoruz.

# Get token with Service Principal for managed identity
$ResourceURI = "https://outlook.office365.com/"
$TokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$TokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$AccessToken = $TokenResponse.access_token
$Authorization = "Bearer {0}" -f $accessToken 
$Password = ConvertTo-SecureString -AsPlainText $Authorization -Force

$Ctoken = New-Object System.Management.Automation.PSCredential -ArgumentList "OAuthUser@a662313f-14fc-43a2-9a7a-d2e27f4f3478",$Password
 
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/PowerShell-LiveId?BasicAuthToOAuthConversion=true -Credential $Ctoken -Authentication Basic -AllowRedirection -Verbose
Import-PSSession $Session | Format-List

$Mbx = Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited
$MbxList = [System.Collections.Generic.List[Object]]::new()
ForEach ($M in $Mbx) {
   $Stats = Get-MailboxStatistics -Identity $M.DistinguishedName
   $MLine = [PSCustomObject][Ordered]@{  # Write out details of the private channel and its members
          Mailbox             = $M.DisplayName
          UPN                 = $M.UserPrincipalName
          Items               = $Stats.ItemCount
          Size                = $Stats.TotalItemSize
          LastInteraction     = $Stats.LastInteraction
          ProhbitSendQuota    = $M.ProhibitSendReceiveQuota }
       $MbxList.Add($MLine) }
$MbxList | Sort-Object Items -Descending | Format-Table Mailbox, Items, Size
Remove-PSSession $Session

Kod, yalnızca eski cmdlet'lerin (şirket içi kaynaklı küme) mevcut olduğu yönündeki büyük uyarıyla çalışır (Şekil 1). Exchange Online yönetim modülünde bulunan daha yeni REST tabanlı cmdlet'lerin hiçbiri (Get-EXOMailbox gibi) kullanılamaz.

Exchange Online V2 Modülünü Kullanma

Büyük miktarda nesne getirirken hızlarından ve güvenilirliklerinden yararlanmak için Exchange Online V2 modülündeki cmdlet'leri kullanmak istiyorsanız bunu yapabilirsiniz, ancak yönetilen kimlikle (şimdilik) bunu yapamazsınız. Bunun yerine, özellikle kullanıcı adı ve parola kimlik bilgilerini Azure Key Vault'ta depolayarak önceki makalelerde açıklanan tekniklerden bazılarını kullanabilirsiniz. Hesabın, Exchange yönetim görevlerini gerçekleştirebilmesi için Exchange yöneticisi rolüne sahip olması gerekir. Bu, Microsoft'un Exchange Online için yönetilen kimlik desteğini mükemmelleştirmesini beklerken bazı tekrarlayan periyodik işlemlerin otomasyonuna izin verecek bir ara aşama olabilir.

Uygun lisanslar için paylaşılan posta kutularını kontrol etmek üzere yazdığım komut dosyasını alın. Normalde, paylaşılan posta kutularının lisansa ihtiyacı yoktur, ancak paylaşılan bir posta kutusu 50 GB'tan fazla içerik depoladığında, bir arşive sahip olduğunda veya dava nedeniyle beklemeye alındığında, kurallar değişir ve posta kutusunun Exchange Online Plan 2 lisansına ihtiyacı olur. Bu gereksinimi göz ardı edebilirsiniz, ancak sonunda Exchange, posta kutusunun e-posta alıp göndermesini durduracaktır ve bu, olması kötü bir yerdir.

Komut dosyası, posta kutuları ve Get-MgUserLicenseDetail cmdlet'iyle (Microsoft Graph PowerShell SDK'sından) etkileşim kurmak için Get-ExoMailbox ve Get-ExoMailboxStatistics cmdlet'lerini kullanır ) paylaşılan posta kutularına sahip olan Azure AD hesaplarının lisans durumunu kontrol etmek için.

Betiğin Azure Otomasyonu'nda çalışmasını sağlamak için, yönetilen bir hesapla Microsoft Graph PowerShell SDK'sında oturum açma kodunu ekledim ve hesap kimlik bilgilerini Azure Key Vault'tan getirdim. Kimlik bilgilerini almak ve Exchange'e bağlanmak için gereken kod:

# Connect to AzAccount to access Key Vault to fetch variables used by the script
$AzConnection = Connect-AzAccount -Identity | Out-Null
# Get username and password from Key Vault
$UserName = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -Name "ExoAccountName" -AsPlainText
$UserPassword = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "ExoAccountPassword" -AsPlainText
# Create credentials object from the username and password
[securestring]$SecurePassword = ConvertTo-SecureString $UserPassword -AsPlainText -Force
[pscredential]$UserCredentials = New-Object System.Management.Automation.PSCredential ($UserName, $SecurePassword)
Connect-ExchangeOnline -Credential $UserCredentials

Bundan sonra, bazı ayrıntıları değiştirmek için komut dosyası kodunu biraz güncellemek kaldı (bazı Write-Host örneklerini kaldırmak ve diğerlerini bunun yerine Write-Output kullanacak şekilde güncellemek gibi) - Azure Otomasyonu'nda bir betik yürütüldüğünde çok sayıda bilgilendirici çıktı eklemenin bir anlamı yoktur). Komut dosyası tamamlandığında Exchange Online bağlantısını kaldırmak için komut dosyasına bir Disconnect-ExchangeOnline komutu da ekledim. Bu, Azure Otomasyonu üçten fazla eşzamanlı bağlantıya izin vermediğinden, test sırasında betiği hızlı bir şekilde art arda birden çok kez çalıştırırken sorunlarla karşılaşmayı önler.

Beklediğim gibi her şey sorunsuz çalıştı (Şekil 2). Yöneticilerin tüketimine uygun çıktı oluşturma sürecinden geçmedim. Bu, şu iyi bilinen yöntemlerden herhangi biri kullanılarak yapılabilir:

  • Bir Teams kanalına mesaj gönderme.
  • SharePoint Online sitesinde belge oluşturma.
  • E-posta gönderiliyor.

Sonraki Adım - Üretim

Her zaman Exchange Online V2 cmdlet'lerini kullanmayı tercih ettiğim için iki yöntemden ikincisini kullanmayı tercih ediyorum. Yönetilen bir kimlik kullanarak V1 modüllerine bağlanmak ilginçtir ancak özellikle üretim çözümünün temelini oluşturacakları için V2 cmdlet'leriyle gitmek daha pratiktir. Bu arada, Azure Key Vault'tan kimlik bilgilerinin alınması mükemmel değildir ancak işe yarar ve bu genellikle en önemli şeydir.

İlgili makaleler