วิธีค้นหากลุ่ม Microsoft 365 ด้วยสมาชิกผู้เยี่ยมชม
มีตัวเลือกวิธีการต่างๆ ให้เลือกเพื่อค้นหากลุ่มที่มีสมาชิกรับเชิญ
ฉันชอบ Graph API มาก แต่บางครั้งมันก็ไม่ใช่ตัวเลือกที่เหมาะสมสำหรับงาน นำตัวอย่างของผู้อ่านที่ต้องการค้นหากลุ่ม Microsoft 365 ทั้งหมดในผู้เช่ากับสมาชิกผู้เยี่ยมชม พวกเขาต้องการใช้ Graph API เพื่อกรองกลุ่มตามการเป็นสมาชิก แต่พบว่าเป็นไปไม่ได้ ประเภทของโค้ดที่จำเป็นในการทำงานแทน:
- ค้นหาบัญชีแขกทั้งหมด
- สำหรับบัญชีแขกแต่ละบัญชี ให้ค้นหากลุ่มที่พวกเขาเป็นสมาชิก
- รายงานกลุ่มกับแขก
ฟังดูตรงไปตรงมา ปัญหาเดียวคือเวลาที่จำเป็นในการสอบปากคำ Azure AD เพื่อค้นหาชุดของกลุ่มสำหรับบัญชีผู้เยี่ยมชมแต่ละบัญชี ตามด้วยการเรียกไปที่ Get-MgGroup เพื่อดึงข้อมูลชื่อที่แสดงเนื่องจาก Get-MgUserMemberGroup ส่งคืนเฉพาะชุดตัวระบุกลุ่ม แทนที่จะเป็นรายละเอียดกลุ่มทั้งหมด ไม่ว่าในกรณีใด นี่คือสิ่งที่ฉันคิดไว้:
[array]$GuestAccounts = Get-MgUser -All -Filter "UserType eq 'Guest'" | Select -ExpandProperty Id
[array]$AllGroups = $Null
ForEach ($Guest in $GuestAccounts) {
[array]$Groups = Get-MgUserMemberGroup -UserId $Guest -SecurityEnabledOnly:$false
$AllGroups += $Groups }
$GraphGroups = $AllGroups | Sort -Unique
ForEach ($Group in $GraphGroups) {
$G = Get-MgGroup -GroupId $Group
If ($G.GroupTypes -like "*Unified*") {
Write-Host ("Microsoft 365 Group {0} found" -f $G.DisplayName) }
}
รหัสช้า แต่ใช้งานได้
รหัสใช้งานได้ แต่ช้า ในผู้เช่าของฉันที่มีบัญชีผู้เยี่ยมชม 170 บัญชีและกลุ่ม Microsoft 365 217 กลุ่ม โค้ดใช้เวลาเพียง 10 วินาทีกว่าในการค้นหา 12 กลุ่มที่มีสมาชิกผู้เยี่ยมชม เป็นเรื่องปกติสำหรับสคริปต์แบบครั้งเดียว แต่เราสามารถทำได้ดีกว่าในแง่ของประสิทธิภาพและฟังก์ชันการทำงาน
ปัญหาทันทีคือไม่มีการกรองสำหรับ Microsoft Graph PowerShell SDK cmdlets เพื่อค้นหากลุ่มที่มีแขก สิ่งนี้บังคับให้ต้องรับแขกทุกคนแล้วค้นหากลุ่มที่พวกเขาอยู่ ความซับซ้อนอีกประการหนึ่งคือ Get-MgUserMemberGroup ส่งคืนกลุ่มทุกประเภทที่แขกสามารถเป็นสมาชิกได้ ในกรณีส่วนใหญ่ กลุ่มเหล่านี้คือกลุ่ม Microsoft 365 แต่คุณสามารถเพิ่มบัญชีผู้เยี่ยมชมลงในรายชื่อการแจกจ่ายได้ ดังนั้นจึงจำเป็นต้องมีการตรวจสอบเพิ่มเติมเพื่อให้แน่ใจว่าเราจะประมวลผลเฉพาะกลุ่ม Microsoft 365 เท่านั้น
การใช้ Get-UnifiedGroup เพื่อค้นหากลุ่มที่มีแขก
อย่างไรก็ตาม มีตัวกรองที่เหมาะสมสำหรับ cmdlet Get-UnifiedGroup นี่ไม่ใช่ Graph cmdlet แต่พิสูจน์ได้ว่ามักจะมีหลายวิธีในการแก้ปัญหาใน Microsoft 365 ที่จริงแล้ว วิธีแก้ปัญหานั้นง่ายมากด้วย Get-UnifiedGroup เนื่องจาก Exchange Online ติดตามจำนวนแขก ในแต่ละกลุ่มในคุณสมบัติที่กรองได้ ซึ่งหมายความว่าเราสามารถใช้ตัวกรองฝั่งเซิร์ฟเวอร์เพื่อค้นหาชุดของกลุ่มที่มีสมาชิกรับเชิญ:
[array]$ExoGroups = Get-UnifiedGroup -Filter {GroupExternalMemberCount -gt 0}
คำสั่งทำงานภายในสองวินาที ถือเป็นการปรับปรุงที่ดี
การตรวจจับกลุ่มที่ไม่ควรมีสมาชิกที่เป็นแขก
ตอนนี้เรารู้แล้วว่ากลุ่ม Microsoft 365 มีสมาชิกผู้เยี่ยมชมใดบ้าง นั่นเป็นข้อมูลที่น่าสนใจ แต่เราสามารถใช้ข้อมูลเพื่อตรวจสอบว่าแขกคนใดอยู่ในกลุ่มที่มีป้ายกำกับความลับซึ่งบล็อกการเข้าถึงของแขกหรือไม่ หากผู้ดูแลระบบกำหนดป้ายกำกับความลับที่บล็อกการเข้าถึงกลุ่มของผู้เยี่ยมชม ป้ายความลับจะป้องกันการเพิ่มสมาชิกผู้เยี่ยมชมใหม่ แต่ไม่มีผลกระทบต่อแขกที่มีอยู่ สมาชิกเหล่านี้ยังคงเพลิดเพลินกับการเข้าถึงทรัพยากรของกลุ่มอย่างเต็มที่ การที่แขกเหล่านี้ยังคงอยู่ทำให้เกิดความไม่สอดคล้องกันจนสมควรได้รับการตรวจสอบเพื่อตัดสินใจว่าป้ายกำกับไม่ถูกต้องหรือควรลบแขกออก
ในการตรวจสอบชุดของกลุ่มที่เราระบุ เราจำเป็นต้องทราบว่าป้ายกำกับความลับใดที่มีการตั้งค่าการจัดการคอนเทนเนอร์ (เพื่อควบคุมทีม กลุ่ม และไซต์) ที่ห้ามมิให้สมาชิกผู้เยี่ยมชม เมื่อต้องการทำสิ่งนี้:
- เรียกใช้ Set-Label cmdlet เพื่อค้นหาป้ายกำกับทั้งหมด
- ค้นหาชุดที่มีการตั้งค่าการจัดการคอนเทนเนอร์
- กรองป้ายกำกับที่บล็อกการเข้าถึงของแขก
โค้ดนี้ทำงานและสร้างตารางแฮชสองตาราง โดยตารางหนึ่งมีชุดป้ายกำกับการจัดการคอนเทนเนอร์ ส่วนอีกตารางหนึ่งมีป้ายกำกับที่อนุญาตให้ผู้เยี่ยมชมเข้าถึงได้
Connect-IPPSSession
[array]$Labels = Get-Label
$ContainerLabels = @{}
$LabelsAllowingGuests = @{}
ForEach ($Label in $Labels) { # Find out which labels apply blocks to guest users
$LabelGuestAccess = $True
$LabelActions = $Label.LabelActions | ConvertFrom-Json
ForEach ($LabelAction in $LabelActions) {
If (($LabelAction.Type -eq "protectgroup") -and ($Label.ContentType -Like "*Site*")) {
$Settings = $LabelAction.Settings
$ContainerLabels.Add([String]$Label.ImmutableId, $Label.DisplayName)
ForEach ($Setting in $Settings) {
If ($Setting.Key -eq "allowaccesstoguestusers" -and $Setting.Value -eq "true") {
$LabelsAllowingGuests.Add([String]$Label.ImmutableId, $Label.DisplayName)}}}
}}
Write-Host “The following labels allow guest access to Groups, Teams, and Sites”
$LabelsAllowingGuests | Format-Table Value
เมื่อมีตารางแฮชเต็ม เราสามารถตรวจสอบป้ายกำกับความลับที่กำหนดให้กับแต่ละกลุ่มได้เพื่อให้แน่ใจว่ามีความสอดคล้องกัน หากกลุ่มมีป้ายกำกับไม่อนุญาติให้แขก เราจะตั้งค่าสถานะกลุ่มเพื่อให้ผู้ดูแลระบบตัดสินใจว่าแขกควรอยู่ต่อหรือถูกลบออก หากการตัดสินใจอนุญาตให้แขกในกลุ่มเป็นสมาชิกได้ วิธีที่ดีที่สุดคือกำหนดป้ายกำกับความลับที่อนุญาตให้แขกเข้าถึงได้
ForEach ($Group in $ExoGroups) {
$CheckLabel = $LabelsAllowingGuests.Item($Group.SensitivityLabel.Guid)
# Write-Host "Group" $Group.DisplayName "Label" $LabelDisplayName
If (!($CheckLabel)) {
$BadLabel = $ContainerLabels.Item($Group.SensitivityLabel.Guid)
Write-Host ("The label assigned to the {0} group doesn't allow guests ({1})" -f $Group.DisplayName, $BadLabel ) }
}
The label assigned to the Corporate Business Development group doesn't allow guests (Limited Access)
The label assigned to the Sales Department team group doesn't allow guests (Limited Access)
ความเร็วและประสิทธิผล
และนั่นก็คือ เราพบกลุ่มที่มีสมาชิกรับเชิญและตรวจสอบกลุ่มเพื่อดูป้ายกำกับความลับที่เหมาะสม การใช้ตัวกรองฝั่งเซิร์ฟเวอร์เพื่อค้นหากลุ่มหมายความว่าประสิทธิภาพการทำงานกับ Get-UnifiedGroup จะดีกว่ามากเมื่อเทียบกับ Graph cmdlets ในปัจจุบัน
โปรดทราบว่าในช่วงไม่กี่ปีที่ผ่านมา Microsoft ได้สร้างชุดการควบคุมสำหรับการจัดการคอนเทนเนอร์ ตัวอย่างล่าสุดคือการควบคุมความสามารถในการแชร์ภายนอกไซต์ แม้ว่าคุณจะไม่ต้องการใช้ป้ายกำกับความลับในการปกป้องเอกสาร Office (และไฟล์ PDF) การใช้ป้ายกำกับสำหรับการจัดการคอนเทนเนอร์เป็นวิธีที่ดีในการนำการตั้งค่าที่สอดคล้องกันไปใช้กับทีม กลุ่ม และไซต์