PowerShell ve Graph ile Ekiplerin Çevrimiçi Toplantılarını Raporlama


Ekiplerin Çevrimiçi Toplantılarının Tüm Ayrıntılarını Çıkarmada Denetim Etkinliklerinden Daha İyisi

Microsoft'un nihayet Purview Denetimi (Standart) lisanslarına sahip kiracıların kullanımına bir dizi ek denetim olayı sunması harika. Bazıları MeetingDetail ve MeetingParticipantDetail etkinliklerinden Teams çevrimiçi toplantılarına ilişkin verileri analiz edebilme ihtimalinden heyecan duyabilir, ancak başka bir yerde de belirttiğim gibi, bu etkinliklerde mevcut olan bilgiler olaylar sandığınız kadar kapsamlı değil.

Denetim etkinlikleri yararlı olsa ve çoğu durumda doğru çözüm olsa da, bir Teams çevrimiçi toplantısı hakkında her şeyi öğrenmek istiyorsanız tek yanıt Microsoft Graph API'leridir. Bu makalede, kullanıcı takvimlerinde Teams çevrimiçi etkinliklerini bulmak ve toplantılara ilişkin katılım bilgilerini ve diğer ayrıntıları çıkarmak için Graph API'lerinin nasıl kullanılacağı açıklanmaktadır. Kendi gereksinimlerinizi karşılayacak şekilde uyarlamanız için tam işlevsel bir PowerShell betiği mevcuttur.

Temel yaklaşım, Microsoft Graph'a yalnızca uygulama modunda bağlanmak (kimlik doğrulamak için Entra ID uygulamasını kullanarak) ve kullanıcı takvimlerinden ve Teams mağazasından verileri okumak için uygulamaya atanan Graph izinlerini kullanmaktır. Son adım, verilerden bir HTML raporu oluşturmaktır.

Çevrimiçi Toplantılara Erişmek İçin Entra ID Başvurusu Oluşturun

İlk adım, Teams çevrimiçi toplantı verilerini, takvim verilerini ve diğer bilgileri almak için gereken izinleri tutacak bir Entra ID uygulaması oluşturmaktır. Uygulamanın, kimlik doğrulama için bir X.509 sertifikasına (kendi kendine oluşturulan veya satın alınan) ihtiyacı vardır. Uygulamayı oluşturduktan sonra aşağıdaki uygulama izinlerini atayın:

  • Takvimler.Oku: İşlenecek çevrimiçi toplantıları bulmak için takvim verilerini okuyun.
  • Grup.Tümünü Oku: İşlenecek hesapları bulmak için grup üyeliğini okuyun.
  • OnlineMeetings.Read.All: Teams çevrimiçi toplantı verilerini okuyun.
  • OnlineMeetingArtifact.Read.All: Teams çevrimiçi toplantılarına ilişkin katılım raporlarını okuyun.
  • CrossTenantInformation.ReadBasic.Tümü: Harici (federe) katılımcılar için kiracı adını çözümlemek üzere katılımcı raporlarındaki bilgileri okuyun.
  • Organization.Read.All: Kiracı hakkındaki bilgileri okuyun (görünen adı gibi).

Şekil 1, komut dosyası tarafından kullanılan uygulama için atanan ve onaylanan uygulama izinleri kümesini gösterir.

Uygulama özelliklerinden uygulama (istemci) tanımlayıcısını, kiracı (dizin) tanımlayıcısını ve sertifika parmak izini not edin. Betikte kullanılacak değerleri PowerShell değişkenlerinde saklayın. Bu öğeler, Graph'a Connect-MgGraph cmdlet'iyle bağlanırken kimlik doğrulaması yapmak için kullanılır.

Uygulama Erişim Politikası Oluşturun

Uygulama izinleri sayesinde uygulama, kiracı genelindeki verilere erişebilir. Evet, ancak yalnızca gruplar, takvimler ve kiracılar arası bilgiler için. Teams çevrimiçi toplantılarına erişmek için kullanılan uygulama izinleri, uygulama erişim ilkesi adı verilen daha ileri bir koruma düzeyine sahiptir.

Bir uygulama erişim ilkesi, bir veya daha fazla Entra ID uygulamasını hesaplara bağlayarak uygulamaların bu hesaplara ait çevrimiçi Teams verilerini işlemesine olanak tanır. Bazı açılardan, Exchange Online tarafından posta kutularına erişimi kısıtlamak için kullanılan uygulamalar için RBAC mekanizmasına benzer.

Teams yönetim merkezi, uygulama erişim ilkelerinin yönetimini desteklemez. Bu eylemlerin PowerShell ile gerçekleştirilmesi gerekir. Öncelikle New-CsApplicationAccessPolicy cmdlet'ini çalıştırarak bir uygulama erişim politikası oluşturuyoruz:

New-CsApplicationAccessPolicy -Identity 'Read Teams Meeting Data' -AppIds "78b6e21f-127d-470d-a61b-295d5c2d058c" -Description "Permission to read Teams Meetings for users"

Identity    : Tag:Read Teams Meetings
AppIds      : {78b6e21f-127d-470d-a61b-295d5c2d058c}
Description : Permission to read Teams Meetings for users

Oluşturulan uygulama erişim politikası ile betiğin çevrimiçi toplantı verilerini işlemesi gereken hesaplara bunu verebiliriz. Belirli bir politikaya atanmamış tüm hesaplara bir uygulama erişim politikası atamak mümkündür ancak bu örnekte, Grant-CsApplicationAccessPolicy cmdlet'ini belirli hesaplara çalıştırıyoruz. Her hesap için cmdlet'i çalıştırın ve hesabın tanımlayıcısını atanan olarak iletin. Kullanıcı asıl adı veya GUID çalışır:

Grant-CsApplicationAccessPolicy -PolicyName 'Read Teams Meeting Data' -Identity 21a3ce8f-6d55-4e57-9210-d85a2f1618ec

Belirli bir kullanıcıya aynı anda yalnızca bir uygulama erişim ilkesi atayabilirsiniz. Bir kullanıcıya yeni bir uygulama erişim ilkesi atamak, mevcut uygulama erişim ilkelerini geçersiz kılar. Ayrıca, uygulama erişim politikasını yalnızca geçerli bir Teams lisansına sahip bir üye hesabına vermek mümkündür. Uygulama erişim izninin, uygulamanın çevrimiçi toplantı verilerine erişmesine izin vermesi 30 dakika kadar sürebilir.

Atamaları yaptıktan sonra uygulamanın işleyebileceği hesapları kontrol edin:

Get-CsOnlineUser -Filter {ApplicationAccessPolicy -eq "Read Teams Meeting Data"} | Select-Object DisplayName,UserPrincipalName,ApplicationAccessPolicy

DisplayName    UserPrincipalName                          ApplicationAccessPolicy
-----------    -----------------                          -----------------------
Alex Wilber    AlexW@o365maestro.onmicrosoft.com          Read Teams Meeting Data
"Popeye" Doyle Popeye.Doyle@o365maestro.onmicrosoft.com   Read Teams Meeting Data
Alain Charnier Alain.Charnier@o365maestro.onmicrosoft.com Read Teams Meeting Data

Microsoft Graph'a bağlanın

İlke atamalarının etkili olmasını bekledikten sonra Microsoft Graph PowerShell SDK'sıyla Microsoft Graph'a bağlanın. Belirtilen hesaplar için çevrimiçi verilere erişimi olan uygulamaya atanan izinleri kullanmak istiyoruz, bu nedenle Connect-MgGraph, uygulama tanımlayıcısını, kiracı tanımlayıcısını ve sertifika parmak izini parametrelerine ekler:

$AppId = "78b6e21f-127d-470d-a61b-295d5c2d058c"
$TenantId = "22e90715-3da6-4a78-9ec6-b3282389492b"
$CertThumbprint = "F79286DB88C21491110109A0222348FACF694CBD"

Connect-MgGraph -AppId $AppId -TenantId $TenantId -CertificateThumbprint $CertThumbprint

Gerekli tüm izinlerin mevcut olduğunu kontrol etmek için Get-MgContext'i çalıştırın. Komut dosyası yalnızca aşağıda listelenen beş iznin oturum için mevcut olması durumunda çalışacaktır:

(Get-MgContext).scopes
OnlineMeetings.Read.All
OnlineMeetingArtifact.Read.All
Calendars.Read
Group.Read.All
CrossTenantInformation.ReadBasic.All
Organization.Read.All

Ekiplerin Çevrimiçi Toplantılarını İşleme Adımları

Komut dosyası aşağıdaki adımları kullanır:

  • Teams çevrimiçi toplantı verilerinin çıkarılacağı kullanıcı hesapları kümesini bulun. Hesap kümesinin yönetimini kolaylaştırmak için komut dosyası, hesapları tutmak için bir dağıtım listesi kullanır ve üyeliği Get-MgMemberGroup cmdlet'iyle okur.
  • Her hesap için, kullanıcının posta kutusundaki takvim klasöründeki etkinlik kümesini okuyun ve çevrimiçi Teams toplantıları kümesini çıkarın.
  • Her toplantı için katılım raporları da dahil olmak üzere ayrıntıları çıkarın.
  • Verilerden bir rapor oluşturun.

Her şey basit gibi görünüyor, ancak her zamanki gibi yolumuza çıkan birkaç ayrıntı var.

Ekiplerin Çevrimiçi Toplantı Verilerini Getirirken Dikkat Edilmesi Gereken Bazı Sorunlar

İlk olarak, Teams çevrimiçi toplantılarına ilişkin verilere erişim 60 gün veya daha sonra duracak gibi görünüyor. Takvim bilgileri her zaman mevcuttur, ancak çevrimiçi boyutla ilgili ayrıntılar yoktur. Görünüşe göre Teams, toplantı verilerini 60 gün sonra çevrimiçi önbellekten çıkarıyor ve daha sonra toplantıyla ilgili ayrıntıları döndürme girişimleri başarısız oluyor. Teams istemcisinde eski bir toplantıyı açmaya çalışırsanız verileri görebilirsiniz. Eski verileri almak ve önbelleğe yüklemek için başka bir API'nin kullanıldığını varsayıyorum.

Bu, denetim olaylarının daha iyi olduğu yerlerin bir örneğidir. Purview Denetimi (Standart) lisanslarınız varsa veriler 180 gün boyunca kullanılabilir. Purview Audit (Premium) ile veriler 365 gün boyunca kullanılabilir.

Toplantı Tanımlayıcılarının Kodunu Çözme ve Kodlama

İkincisi, muhtemelen her Teams toplantısı için yayınlanan toplantı URL'sinin farkındasınızdır. Toplantı ayrıntılarını almak için Get onlineMeeting API'sini kullanırken API, bir çevrimiçi toplantı nesnesinin tanımlayıcısını gerektirir. Belgeler, toplantı tanımlayıcısının biçimini tanımlama açısından pek yararlı değil, ancak bazı aramalar, aşağıdaki adımları kullanan bir yöntemi ortaya çıkardı:

  1. Toplantıya katılma URL'sini getirin. Değer şöyle olacaktır: https://teams.microsoft.com/l/meetup-join/19%3ameeting_YzU5NTYwM2QtMmU3YS00YmNlLWEwZWMtNzA0NTk4OTZlNjJi%40thread.v2/0?context=%7b%22Tid%22%3a%22a662313f-1 4fc -43a2-9a7a-d2e27f4f3478%22%2c%22Oid%22%3a%225b52fba5-349e-4622-88cd-d790883fe4c4%22%7d (MC772556'ya göre Microsoft, daha kısa bir toplantıya katılma URL biçimini benimsemeyi planlıyor Ağustos 2024).
  2. URL'nin kodunu çözün.
  3. Kodu çözülmüş toplantıya katılma URL'sinde toplantı tanımlayıcısını bulun (19:meeting_ZmY4YTJhNmUtY2Y3OS00ZGZlLWI1ODEtYjA2ZTZmZjA0YzQ0@thread.v2 gibi bir değer).
  4. Belirli bir şekilde biçimlendirilmiş bir arama değeri oluşturun. Değer, düzenleyenin kullanıcı tanımlayıcısını ve toplantı tanımlayıcısını içerir ve şu şekilde görünür: 1*880e1e61-af63-43c9-a48e-d6b63684c21c*0**19:meeting_ZmY4YTJhNmUtY2Y3OS00ZGZlLWI1ODEtYjA2ZTZmZjA0YzQ0@thread.v2 .
  5. Toplantı arama tanımlayıcısının BASE64 kodlu değerini oluşturun.

Microsoft'un, birisinin toplantılara erişmemesi gereken bir şekilde bir tanımlayıcıyı kötüye kullanma olasılığını sınırlamak için Teams toplantı tanımlayıcılarını bu şekilde gizlediğini varsayıyorum. Her durumda kullandığım PowerShell kodu:

$MeetingURL =  $Item.onlinemeeting.joinUrl.trim()
$DecodedURL = [System.Web.HttpUtility]::UrlDecode($MeetingURL)
$MeetingIdStart = $DecodedURL.IndexOf("19:") 
$MeetingIdEnd = $DecodedURL.IndexOf("thread")
$MeetingId = $DecodedURL.Substring($MeetingIdStart, $MeetingIdEnd - $MeetingIdStart +9)
$MeetingIdLookup = ("1*{0}*0**{1}" -f $Organizer.id, $MeetingId)
$Base64MeetingId = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($MeetingIdLookup))

Betik daha sonra bir Grafik isteğiyle kullanılacak bir URI oluşturabilir. URI şuna benzer:

https://graph.microsoft.com/v1.0/users/880e1e61-af63-43c9-a48e-d6b63684c21c/onlineMeetings/MSo4ODBlMWU2MS1hZjYzLTQzYzktYTQ4ZS1kNmI2MzY4NGMyMWMqMCoqMTk6bWVldGluZ19 abVk0WVRKaE5tVXRZMlkzT1MwMFpHWmxMV0kxT0RFdFlqQTJaVFptWmpBMFl6UTBAdGhyZWFkLnYy

Dönüş değeri, Teams'in çevrimiçi toplantı hakkında tuttuğu ayrıntılardır.

Bundan sonra geriye kalan tek şey, bir toplantının birkaç kez başlayıp bitebilmesidir. Her örnek bir katılım raporu ve transkript gibi diğer yapıları oluşturur.

Bir toplantının herhangi bir örneğine kimin katıldığını bilmek istiyoruz, bu nedenle komut dosyası tüm katılım raporlarını bulur ve her rapor için katılım verilerini çıkarır.

Rapor

Bir PowerShell betiği ne kadar güzel olursa olsun, yararlı çıktılar üretmiyorsa kod işe yaramaz. Bu durumda çıktı, toplantı ve katılım ayrıntılarıyla birlikte çevrimiçi toplantıları kullanıcıya göre listeleyen bir HTML raporudur (Şekil 2).

Konuk hesapları bir toplantıya katıldığında genellikle katılmadan önce toplantı sahibi kiracıya geçtiklerini unutmayın (bazı kuruluşlar tarafından uygulanan bir disiplin). Bu, hesabın o kiracıya aitmiş gibi görünmesini sağlar (ki öyledir), böylece federe katılımcılar (kendi hesaplarını kullanarak başka bir kiracıdaki toplantıya katılmak için oturum açanlar) dışında ev kiracısının adını göremezsiniz.

Komut dosyası GitHub'dan edinilebilir. Umarım PowerShell kodu anlaşılırdır. Değilse, lütfen benim için düzelttiğinizden emin olun. Alabildiğim tüm yardımı kullanabilirim.

İlgili makaleler