Grafikle Üyesiz Grupları ve Sahipsiz Grupları Bulma
Üyesiz Grupları Bulmanın En İyi Yolunu Arıyoruz
Graph API'lerini kullanarak üyesi olmayan grupların nasıl bulunacağı sorusu ortaya çıktı. Bu, özellikle kişilerin şirketten ayrılması veya rol değiştirmesi nedeniyle grup üyeliğinin zaman içinde giderek azaldığı büyük Microsoft 365 kiracılarında yaygın bir sorundur. Microsoft'un sahipsiz grup ilkesi, aynı nedenlerle sahibi olmayan grupların bulunması sorununu çözmenin bir yoludur, ancak yalnızca Microsoft 365 gruplarını yönetir ve sıfır üyelik olup olmadığını kontrol etmez. Microsoft 365'te desteklenen tüm grup türleriyle ilgilenmek için bir yanıta ihtiyaç vardır.
Microsoft Graph PowerShell SDK geliştirme ekibinin GitHub deposundaki bir tartışma (Grafik hakkında bilgiler bulmak için her zaman iyi bir yerdir), soruna yaklaşmanın çeşitli yollarını sunar. Burada ve başka yerlerde bahsedilen yaklaşımlar genellikle tüm grupları getirir ve üyesi olmayan grupları bulmak için istemci tarafı bir filtre uygular.
Grafik tarafından tanımlanan grup kaynağı türü, sahip ve üye koleksiyonlarını desteklese de, bu yapıların sahipleri veya üyeleri ortaya çıkaracak şekilde genişletilmesi gerekir. Grupları Listele Grafiği API'si, üyesiz veya sahipsiz grupları bulmak için tek bir işlemde sahip veya üye koleksiyonlarını filtreleyemez ve genişletemez. Bu nedenle gördüğüm önerilen çözümlerin çoğu, grup kümesini getirerek ve her grubun üyeliğini kontrol etmek için istemci tarafı filtresini veya ForEach-Object döngüsünü kullanarak çalışıyor.
Üyesiz Gruplar için Değişim Çözümü
Exchange Online yönetim modülündeki Get-UnifiedGroup cmdlet'i, üyelik sayılarını tutmak için iki gizli grup hesaplanmış özelliğe sahiptir. Bu özellikler Entra ID yerine EXODS'taki (Exchange Online Dizin Deposu) grup nesneleriyle birlikte depolanır. Bir mülk üye sayısını tutarken, diğeri harici (misafir) üyelerin sayısını tutar.
Örneğin, üyelik sayısı sıfır olan Microsoft 365 Gruplarını bulmak için şunu çalıştırın:
Get-UnifiedGroup -Filter {GroupMemberCount -eq 0}
Bu filtre sunucu tarafında çalıştırılır, dolayısıyla oldukça etkilidir. Ancak Get-UnifiedGroup cmdlet'i yalnızca Microsoft 365 Gruplarını işler. Dağıtım listeleri, güvenlik grupları ve posta özellikli güvenlik grupları dikkate alınmaz.
Grafik Çözümü
Microsoft Graph PowerShell SDK'sındaki Get-MgGroup cmdlet'i, dinamik dağıtım listeleri dışında tüm Microsoft 365 grubu türlerini işler. Exchange Online, dinamik dağıtım listelerini Entra ID ile senkronize etmediğinden bu nesneler Graph API'leri tarafından görülmez.
Getirme ve filtreleme çözümünün bu varyasyonu, tüm grupları getirmek için Get-MgGroup cmdlet'ini kullanır ve Grafik nesneleri alırken üye koleksiyonunu genişletir. Grafik nesneleri getirirken yalnızca tek bir genişletilebilir özellik işlenebilir; böylece aynı anda üyesi olmayan grupları veya sahipsiz grupları arayabilirsiniz.
Konsepti kanıtlamak ve getirilen veri miktarını en aza indirmek için yalnızca iki özellik istenir: Üyeler ve grup tanımlayıcı. Grupları getirdikten sonra, istemci tarafı filtresi sıfır üyeliğe sahip kümeyi bulur. Sayfa boyutunun 999'a (maksimum) artırılması, setin tamamını getirmek için gereken işlem sayısını en aza indirir.
Write-Host "Checking for groups with no members..."
[array]$NoMembers = Get-MgGroup -All -PageSize 999 -ExpandProperty "members(`$select=id)" -Property Members, Id | Select-Object Members, Id | Where-Object {($_.Members.count) -eq 0}
$NoMembers
Members Id
------- --
{} 0335947a-60ce-4f46-a7e0-47531da381c4
{} 0644e3ba-a489-471f-aadd-3bd29a0f3391
{} 07ef82f5-6fd6-4a20-a47d-6c7249579255
{} 0a022083-29b3-46f7-aa61-6e830e88d167
Liste Grupları Grafiği API'sine karşı yapılan isteğin aynısı şuna benzer:
$uri = "https://graph.microsoft.com/v1.0/groups?`$expand=members(`$select=id)&`$select=id"
[array]$data = Invoke-MgGraphRequest -Method get -Uri $Uri
[array]$NoMembers = $Data.Value | Where-Object {$_.Members.count -eq 0}
Grafik, istekler tarafından alınan nesnelerin sayısını sınırladığından, sonuçların tamamını almak için sayfalara ayırmanız gerekir. Get-MgGroup cmdlet'i için All parametresinin belirtilmesi, cmdlet'in sayfalandırmasını yönetir.
Bu çözüm, üyesi olmayan grupların kümesini bulmasıyla işe yarar. Kodu ilk kez kiracımda çalıştırdığımda, bu kadar çok sayıda sahipsiz grup bulduğuma şaşırdım. Açıkça görülüyor ki kiracımın temizlik işleri kusursuz değil.
Üyesiz Grupları Bildirmek İçin Komut Dosyası Oluşturma
Bir dizi grup tanımlayıcının kiracı yöneticisine hiçbir faydası yoktur. Daha gelişmiş bir çözüm, üyesi olmayan grupların, grupları araştırmak için gereken ayrıntıları içeren bir raporunu oluşturur. Bu nedenle aşağıdakilere bir senaryo yazdım:
- Görünen ad, güvenliğin etkin olduğu bayrak, oluşturulma tarihi vb. gibi her grup hakkında daha fazla bilgi alın.
- Her grubun türünü kontrol edin. Grup bir Microsoft 365 grubu değilse ve posta özelliği etkinse bir dağıtım listesi olması muhtemeldir, dolayısıyla komut dosyası bunun doğru olup olmadığını kontrol eder.
- Bir rapor oluşturur (Şekil 1) ve verileri CSV dosyası olarak çıkarır.
- Sahipsiz gruplar için de aynısını yapar (teknik aynıdır ve Üyeler yerine Sahipler özelliğini kontrol eder).
Komut dosyasının tamamını GitHub'dan indirebilirsiniz.
Performans Üzerine Bir Söz
Büyük bir kiracıdaki her grubu alıp analiz etmek hızlı bir işlem olmayacaktır. On binlerce grubu işleme göreviyle karşı karşıya kalırsanız, belki de 26 grup oluşturmak için grup görünen adlarının ilk harfini kullanarak işlemeyi gruplara bölerim. PowerShell 7'de sunulan paralel işleme özelliklerinin de yardımcı olması mümkündür.
Sahipsiz veya üyesi olmayan grupları aramak günlük bir iş değildir. İşi, çıktı dosyalarını bir SharePoint Online sitesine yükleyen veya dosyaları e-posta yoluyla yöneticilere ek olarak gönderen bir Azure Otomasyonu zamanlanmış runbook olarak çalıştırmayı düşünün. Bu sorun gruplarını kontrol altında tutmak için ayda bir kez uygulamanız yeterli olacaktır.
