ค้นหาเว็บไซต์

ใช้ข้อมูลประจำตัวที่มีการจัดการ Azure Automation กับ Exchange Online


แลกเปลี่ยนออนไลน์และ Azure Automation

อัปเดตเมื่อ 15 กุมภาพันธ์ 2024

ในบทความก่อนหน้านี้ ฉันได้สำรวจวิธีใช้โมดูล Microsoft Teams และ Microsoft Graph PowerShell SDK กับข้อมูลระบุตัวตนที่ได้รับการจัดการของ Azure Automation ในเวลานั้น ฉันสังเกตเห็นว่า Exchange Online ไม่รองรับข้อมูลระบุตัวตนที่ได้รับการจัดการ ปัญหาหายไปเมื่อ Microsoft เปิดตัวโมดูล Exchange Online Management เวอร์ชัน 3.0 พร้อมด้วยการรองรับ Managed Identities การเชื่อมต่อกับ Exchange Online ด้วยข้อมูลประจำตัวที่มีการจัดการจำเป็นต้องระบุองค์กรที่จะเชื่อมต่อ ก็แค่นั้นแหละ

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

บริการหลักที่เป็นของข้อมูลเฉพาะตัวที่ได้รับการจัดการจำเป็นต้องได้รับสิทธิ์ในการดำเนินการจัดการ Exchange Online ฉันทราบว่าคุณไม่สามารถสร้างกลุ่ม Microsoft 365 ใหม่ด้วย cmdlet New-UnifiedGroup ได้ นี่อาจเป็นข้อผิดพลาดชั่วคราว หรือบางที cmdlet นี้ยังไม่สามารถทำงานกับข้อมูลประจำตัวที่มีการจัดการได้

อัปเดต: ใช้โมดูลการจัดการ Exchange Online เวอร์ชันล่าสุด (V3.0 หรือสูงกว่า) เสมอเพื่อเชื่อมต่อกับ Exchange Online ด้วย Azure Automation วิธีการที่อธิบายด้านล่างนี้เป็นวิธีการที่น่าสนใจในอดีตเท่านั้น ดูข้อมูลเพิ่มเติมในเอกสารประกอบของ Microsoft Microsoft ยังไม่ได้อัปเกรด cmdlet การจัดการกลุ่ม Microsoft 365 บางส่วนให้ทำงานกับ Azure Automation หลังจากตรวจสอบสิทธิ์ด้วยข้อมูลประจำตัวที่มีการจัดการ ฟังก์ชันการทำงานของ cmdlets เหล่านี้สามารถแทนที่ได้ด้วย cmdlets จากคำขอ Microsoft Graph PowerShell SDK หรือ Graph API

การใช้ข้อมูลประจำตัวที่มีการจัดการกับ Exchange PowerShell V1

ในขณะที่เรารอให้ Microsoft ส่งมอบโมดูลการใช้งานจริง คุณสามารถใช้โมดูล V1 Exchange รุ่นเก่าที่มีข้อมูลประจำตัวที่มีการจัดการได้ MVP Vasil Michev อธิบายวิธีการในบล็อกของเขา ก่อนที่จะไปไกลกว่านี้ สิ่งสำคัญคือต้องบอกว่า Microsoft ไม่สนับสนุนวิธีนี้เช่นกัน ใช้งานได้ แต่ถ้าคุณใช้งานจริง อย่าคาดหวังว่าจะสามารถโทรติดต่อฝ่ายสนับสนุนของ Microsoft ได้หากมีสิ่งผิดปกติเกิดขึ้น

ขั้นตอนสำคัญในกระบวนการนี้คือการกำหนดบทบาท จัดการ Exchange As Application ให้กับบริการหลักของข้อมูลประจำตัวที่ได้รับการจัดการที่คุณเลือกใช้ ทำได้โดย:

  • รับรายละเอียดของแอป Microsoft Enterprise ที่ลงทะเบียนสำหรับการจัดการ Exchange
  • กำลังดึงข้อมูลตัวระบุสิทธิ์สำหรับบทบาท จัดการ Exchange เป็นแอปพลิเคชัน จากชุดบทบาทที่กำหนดไว้สำหรับแอปการจัดการ Exchange
  • การใช้ข้อมูลเพื่อกำหนดบทบาท จัดการ Exchange เป็นแอปพลิเคชัน ให้กับบริการหลักสำหรับข้อมูลประจำตัวที่มีการจัดการ

เป็นอีกครั้งที่ PowerShell เป็นวิธีเดียวที่จะทำการมอบหมายงานได้ นี่คือรหัสที่ฉันใช้:

$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

เมื่อบริการหลักมีบทบาทในการอนุญาตให้ทำหน้าที่เป็นผู้ดูแลระบบ Exchange เราก็สามารถเปิดใช้งานได้ รหัสนี้คือตัวอย่างของการใช้ข้อมูลประจำตัวที่มีการจัดการเพื่อลงชื่อเข้าใช้ Exchange Online โดยใช้โทเค็นการเข้าถึงที่สร้างขึ้นสำหรับข้อมูลประจำตัว (โดยใช้บัญชีพิเศษที่เรียกว่า OAuthUser@ บวกกับตัวระบุผู้เช่า (OAuthUser@a662313f-14fc-43a2-9a7a-d2e27f4f3478 ในกรณีนี้) หลังจากเชื่อมต่อ เราจะเรียกใช้โค้ด Exchange PowerShell มาตรฐานเพื่อค้นหากล่องจดหมายของผู้ใช้ทั้งหมดและส่งกลับสถิติกล่องจดหมายบางส่วน

# 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

โค้ดใช้งานได้ (รูปที่ 1) โดยมีข้อแม้สำคัญว่ามีเพียง cmdlets เก่า (ชุดที่มาจากภายในองค์กร) เท่านั้นที่พร้อมใช้งาน ไม่พบ cmdlet ที่ใช้ REST ที่ใหม่กว่าในโมดูลการจัดการ Exchange Online (เช่น Get-EXOMailbox) ที่สามารถใช้ได้

การใช้โมดูล Exchange Online V2

หากคุณต้องการใช้ cmdlet ในโมดูล Exchange Online V2 เพื่อใช้ประโยชน์จากความเร็วและความน่าเชื่อถือเมื่อดึงข้อมูลออบเจ็กต์จำนวนมาก คุณสามารถทำได้ แต่จะไม่สามารถใช้ข้อมูลระบุตัวตนที่ได้รับการจัดการได้ (ในขณะนี้) คุณสามารถใช้เทคนิคบางอย่างที่สำรวจในบทความก่อนหน้านี้แทน โดยเฉพาะอย่างยิ่งการจัดเก็บข้อมูลประจำตัวของชื่อผู้ใช้และรหัสผ่านใน Azure Key Vault บัญชีต้องมีบทบาทผู้ดูแลระบบ Exchange เพื่อให้สามารถดำเนินงานการดูแลระบบ Exchange ได้ นี่อาจเป็นขั้นตอนชั่วคราวเพื่อให้ระบบอัตโนมัติของการประมวลผลเป็นระยะๆ ซ้ำๆ ในขณะที่รอให้ Microsoft ดำเนินการสนับสนุนข้อมูลประจำตัวที่มีการจัดการที่สมบูรณ์แบบสำหรับ Exchange Online

ใช้สคริปต์ที่ฉันเขียนเพื่อตรวจสอบกล่องจดหมายที่ใช้ร่วมกันเพื่อดูใบอนุญาตที่เหมาะสม โดยปกติแล้ว กล่องจดหมายที่ใช้ร่วมกันไม่จำเป็นต้องมีใบอนุญาต แต่เมื่อกล่องจดหมายที่ใช้ร่วมกันจัดเก็บเนื้อหามากกว่า 50 GB มีการเก็บถาวร หรืออยู่ระหว่างการระงับการดำเนินคดี กฎจะเปลี่ยนไปและกล่องจดหมายจำเป็นต้องมีใบอนุญาต Exchange Online Plan 2 คุณสามารถเพิกเฉยต่อข้อกำหนดได้ แต่ในที่สุด Exchange จะหยุดกล่องจดหมายจากการรับและส่งอีเมล และนั่นเป็นสถานที่ที่ไม่เหมาะสม

สคริปต์ใช้ cmdlet Get-ExoMailbox และ Get-ExoMailboxStatistics เพื่อโต้ตอบกับกล่องจดหมายและ cmdlet Get-MgUserLicenseDetail (จาก Microsoft Graph PowerShell SDK ) เพื่อตรวจสอบสถานะสิทธิ์การใช้งานของบัญชี Azure AD ที่เป็นเจ้าของกล่องจดหมายที่แชร์

เพื่อให้สคริปต์ทำงานใน Azure Automation ฉันได้รวมโค้ดเพื่อลงชื่อเข้าใช้ Microsoft Graph PowerShell SDK ด้วยบัญชีที่ได้รับการจัดการ และดึงข้อมูลประจำตัวของบัญชีจาก Azure Key Vault นี่คือรหัสในการดึงข้อมูลรับรองและเชื่อมต่อกับ Exchange:

# 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

หลังจากนั้น เป็นเพียงเรื่องของการอัปเดตโค้ดสคริปต์เล็กน้อยเพื่อเปลี่ยนแปลงรายละเอียดบางอย่าง (เช่น ลบบางอินสแตนซ์ของ Write-Host และอัปเดตอื่นๆ ให้ใช้ Write-Output แทน - ไม่มีประโยชน์ที่จะรวมเอาต์พุตข้อมูลจำนวนมากเมื่อสคริปต์ทำงานใน Azure Automation) ฉันยังรวมคำสั่ง Disconnect-ExchangeOnline ไว้ในสคริปต์เพื่อลบการเชื่อมต่อกับ Exchange Online เมื่อสคริปต์เสร็จสิ้น วิธีนี้จะหลีกเลี่ยงปัญหาเมื่อเรียกใช้สคริปต์หลายครั้งติดต่อกันอย่างรวดเร็วในระหว่างการทดสอบ เนื่องจาก Azure Automation ไม่อนุญาตให้มีการเชื่อมต่อพร้อมกันมากกว่าสามครั้ง

อย่างที่ฉันคาดไว้ ทุกอย่างทำงานได้โดยไม่มีข้อผูกมัด (รูปที่ 2) ฉันไม่ได้ผ่านกระบวนการสร้างผลลัพธ์ที่เหมาะสมสำหรับผู้ดูแลระบบ ซึ่งสามารถทำได้โดยใช้วิธีการที่รู้จักกันดีเหล่านี้:

  • การโพสต์ข้อความไปยังช่องทาง Teams
  • การสร้างเอกสารในไซต์ SharePoint Online
  • กำลังส่งอีเมล

ขั้นตอนต่อไป - การผลิต

จากทั้งสองวิธี ฉันชอบใช้วิธีที่สองเนื่องจากฉันชอบใช้ Exchange Online V2 cmdlets เสมอ การเชื่อมต่อกับโมดูล V1 โดยใช้ข้อมูลประจำตัวที่ได้รับการจัดการเป็นเรื่องที่น่าสนใจ แต่การใช้ cmdlets V2 จะมีประโยชน์มากกว่า โดยเฉพาะอย่างยิ่งเนื่องจากสิ่งเหล่านี้จะเป็นพื้นฐานสำหรับโซลูชันการใช้งานจริง ในระหว่างนี้ การดึงข้อมูลประจำตัวจาก Azure Key Vault นั้นไม่สมบูรณ์แบบ แต่ใช้งานได้ และโดยปกติแล้วนั่นคือสิ่งที่สำคัญที่สุด

บทความที่เกี่ยวข้อง