eDiscovery Vakalarını Oluşturmak ve Çalıştırmak İçin PowerShell Kullanımı
Microsoft, standart ve premium vakaları ve içerik aramalarını kapsayan vaka yönetimi için yeni bir çözüm sunmak amacıyla Purview eDiscovery ürününü yakın zamanda modernize etti. Microsoft, klasik eDiscovery’yi (premium) Ağustos 2025’te kullanımdan kaldırmayı planlıyor . Bu tarihten itibaren bu ürün, mevcut tek Purview eDiscovery çözümü olacak. İnceleme setleri ve veri temizleme gibi bazı eDiscovery özellikleri yalnızca premium vakalar için kullanılabilir olacak ve bunlar için Office 365 E5 lisansları gerekecektir. Purview, premium lisans mevcut değilse gerektiğinde özellikleri gizleyerek hem standart hem de premium eDiscovery vakaları için portal üzerinden aynı kullanıcı deneyim ekranını kullanacaktır.
Bu güncellemenin bir parçasıda, Microsoft Graph PowerShell SDK aracılığıyla erişilebilen her API yöntemini eşleyen cmdlet’lerle yenilenmiş bir Graph eDiscovery API’sidir. Bu makale, SDK cmdlet’lerinin (V2.28’i kullandım) eDiscovery vaka yönetiminin bazı öğelerini oluşturmak ve otomatikleştirmek için Bu API’nin nasıl kullanılacağını açıklamayı hedeflemektedir.
Yeni bir eDiscovery Davası Oluşturun
Vakalar, eDiscovery’nin merkezi bileşenidir. Her şey bir vakaya bağlıdır, bu yüzden ilk adım, üzerinde çalışılacak bir vaka oluşturmaktır. Örnek senaryo, insanların karantinaya alınan e-postalar aldığında Exchange Online tarafından gönderilen eski e-posta bildirimlerini bulmaktır. Bu çok heyecan verici görünmeyebilir, ancak API’yi kullanarak öğeleri herhangi bir zarar vermeden nasıl temizleyeceğimizi keşfetmemizi sağlar.
Microsoft Graph PowerShell SDK’sını kullanarak eDiscovery ile çalışmak için ilk adım, eDiscovery Manager Purview RBAC rolünü elinde bulunduran bir hesap kullanarak eDiscovery.ReadWrite.All kapsamı (izin) ile etkileşimli bir oturuma bağlanmaktır :
Connect-MgGraph -Scopes eDiscovery.ReadWrite.All
Yeni bir vaka oluşturmak için (ki bu her zaman birinci sınıf bir eDiscovery vakası olacaktır), vakanın ayrıntılarını tutan karma tablosu kullanırız. Bunun için yalnızca görüntüleme adı gereklidir. Açıklama ve harici tanımlayıcı (müşterilerin eDiscovery vakalarını tanımasına yardımcı olacak bir değer) ikisi de isteğe bağlıdır. Karma tablosunu doldurduktan sonra,
New-MgSecurityCaseEdiscoveryCase cmdlet’ini çalıştırın ve karma tablosunu yük (gövde parametresi) olarak atayın :
$NewCaseDetails = @{}
$NewCaseDetails.Add("displayName", "Unwanted Quarantine Notifications")
$NewCaseDetails.Add("description","eDiscovery Case to Find and Remove unwanted Quarantine notifications older than 30 days")
$NewCaseDetails.Add("externalId","UQN-001")
$Case = New-MgSecurityCaseEdiscoveryCase -BodyParameter $NewCaseDetails
$Case değişkeni artık tanımlayıcısı da dahil olmak üzere vakanın tüm ayrıntılarını tutar. Diğer cmdlet’lerle etkileşim kurmak için bu bilgiye ihtiyacımız olacak.
Vakaları Bul
Bazen yeni oluşturulan vakanın ayrıntılarını bir değişkende saklamayı unutabilirsiniz, bu yüzden son bir ayda oluşturulan vaka kümesini bulalım ve ayrıntılarını görüntüleyelim. Bu kod, son bir ayda oluşturulan vakaları bulmak için bir filtreyle Get-MgSecurityCaseEdiscoveryCase cmdlet’ini kullanır.
$LastMonth = (Get-Date).AddDays(-31).ToString("yyyy-MM-ddTHH:mm:ssZ")
[array]$Cases = Get-MgSecurityCaseEdiscoveryCase -Filter "CreatedDateTime gt $LastMonth" -Sort 'CreatedDateTime DESC'
$Cases | Format-Table DisplayName, Id, CreatedDateTime -AutoSize
DisplayName Id CreatedDateTime
----------- -- ---------------
Unwanted Quarantine Notifications 7fc26cf0-bc8d-421c-8ad1-bea9782f564c 03/06/2025 16:24:45
Nouvon Investigation b111e498-e24b-45ac-9e67-225a29c0caeb 29/05/2025 14:31:01
Üzerinde çalışmak istediğimiz durum listedeki ilk durumdur, dolayısıyla ayrıntılarını şu şekilde bir değişkene atayabiliriz.
$Case = $Cases[0]
Bir Arama Oluştur
Aramalar, araştırmacıların inceleyebileceği öğeleri buldukları için eDiscovery vakalarının omurgasını oluşturur. Bu durumda, 30 günden ( bir mesajın karantinada kalabileceği maksimum süre ) daha eski karantina bildirimlerini bulmak istiyoruz. Güvenli olmak için 31 günden eski mesajları arayacağız. Arama tarihini doğru biçimde oluşturduktan sonra, arama için KeyQL sorgusunun geri kalanını oluşturuyoruz. Herhangi bir eDiscovery sorgusunda olduğu gibi, aramanın hedef öğelere odaklanabilmesi için mümkün olduğunca kesin olmak kritik önem taşır. Bu durumda, sorgu belirli bir gönderici ve konu için iki varyasyondan biriyle 31 günden daha önce alınan mesajları tarar.
$OlderThanDate = (Get-Date).AddDays(-31).toString('yyyy-MM-dd')
$Query = ‘(ItemClass=IPM.Note) AND (Received<={0} AND (SubjectTitle="You have some quarantined messages to deal with" OR SubjectTitle=“Quarantined messages are waiting for your review”) AND ([email protected]))’ -f $OlderThanDate
Bu tablo arama parametrelerini tutar. Veri kaynağı kapsamları parametresi, aramanın sorguyla eşleşen öğeleri tarayacağı konumları tanımlar. Bu durumda, sorgu kiracıdaki her posta kutusunu aramalıdır ve bu, özel allTenantMailboxes konumu tarafından tanımlanır. Tüm SharePoint ve OneDrive sitelerini aramak için allTenantSites konumunu eklemelisiniz. New-MgSecurityCaseEdiscoveryCaseSearch cmdlet’i yeni durumu oluşturur. Yeni oluşturulan aramanın ayrıntıları ise $Search değişkeninde yakalanır.
$NewSearchDetails= @{}
$NewSearchDetails.Add("displayName","Find Quarantined message notifications")
$NewSearchDetails.Add("Description","Search mailboxes for notifications about email held in quarantine that are older than 30 days old.")
$NewSearchDetails.Add("contentQuery", $Query)
$NewSearchDetails.Add("dataSourceScopes","allTenantMailboxes")
$Search = New-MgSecurityCaseEdiscoveryCaseSearch -EdiscoveryCaseId $Case.Id -BodyParameter $NewSearchDetails
Şekil 1’de oluşturulan aramanın eDiscovery UX aracılığıyla nasıl göründüğü gösterilmektedir.

Şekil 1: Purview eDiscovery davasında yapılan bir aramanın ayrıntıları
Bireysel Veri Kaynaklarının Eklenmesi
Bir veri kaynağı eklerken organizasyon içerisindeki tüm kiracı posta kutularını veya sitelerini aramak yerine, NewMgSecurityCaseEdiscoveryCaseSearchAdditionalSource cmdlet’ini kullanarak bir sorguya ayrı ayrı konumlar (veri kaynakları) ekleyebilirsiniz. Bu konumlara ek kaynaklar denir ve bunlar kullanıcılar, gruplar veya siteler olabilir. Bir kullanıcı eklediğinizde, posta kutusu ve OneDrive for Business hesabı arama için bir veri kaynağı haline gelir. Her konum ayrı ayrı eklenmelidir. Bir kullanıcı ve bir SharePoint Online sitesinin bir arama için veri kaynağı olarak eklenmesine ilişkin bir örnek aşağıdadır:
$UserSourceDetails = @{}
$SiteSourceDetails = @{}
$UserSourceDetails.Add("@odata.type","microsoft.graph.security.userSource")
$UserSourceDetails.Add("email","[email protected]")
$SiteSourceDetails.Add("@odata.type","microsoft.graph.security.siteSource")
$SiteSourceDetails.Add("site", @{webUrl = "https://office365itpros.sharepoint.com/sites/BlogsAndProjects"})
New-MgSecurityCaseEdiscoveryCaseSearchAdditionalSource -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id -BodyParameter $UserSourceDetails
New-MgSecurityCaseEdiscoveryCaseSearchAdditionalSource -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id -BodyParameter $SiteSourceDetails
Bir vaka tarafından taranan kaynakları tek tek listelemek için,
Get-MgSecurityCaseEdiscoveryCaseSearchAdditionalSource cmdlet’ini kullanın ve ardından bilgileri gözden geçirin.
[array]$DataSources = Get-MgSecurityCaseEdiscoveryCaseSearchAdditionalSource -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id -All | Select-Object -ExpandProperty additionalProperties
$Report = [System.Collections.Generic.List[Object]]::new()
ForEach ($S in $DataSources) {
$Source = $null; $SourceType = $null; $SiteSource = $null
Switch ($S.'@odata.type') {
"#microsoft.graph.security.userSource" {
$SourceType = "User"
$Source = $S.email
If ($S.includedSources -eq "mailbox,site") {
$SiteSource = $S.siteWebUrl
$SiteSource = "Mailbox and OneDrive"
}
}
"#microsoft.graph.security.siteSource" {
$SourceType = "Site"
$SiteSource = $S.site.webUrl
$Source = $S.site.displayName
If ($null -eq $Source) { $Source = "OneDrive for Business" }
}
}
$ReportLine = [PSCustomObject][Ordered]@{
Source = $Source
‘Site’ = $SiteSource
'SourceType' = $SourceType
}
$Report.Add($ReportLine)
}
$Report | Out-GridView
Saklama Politikaları
Bir eDiscovery hold, bir KeyQL sorgusu tarafından belirtilen bilgileri tutar. Yani öğeler orijinal konumlarında kalır. Bir kullanıcı tutulan bir öğeyi silerse, sorumlu iş yükü tutma kaldırılıncaya kadar öğeyi saklamaktadır.
Bir eDiscovery hold, bir hold politikasından (hold’un ayrıntıları) ve bir hold kuralından (KeyQL sorgusu) oluşur. Genellikle, sorgu bir case aramasında kullanılanla aynıdır, ancak olmak zorunda değildir. Bu kod, yukarıda oluşturulan aramadan gelen sorguyu kullanan bir hold oluşturmak için New-MgBetaSecurityCaseEdiscoveryCaseLegalHold cmdlet’ini çalıştırır:
$HoldParameters = @{}
$HoldParameters.Add("displayName", "In-place hold for Investigation 2025-101")
$HoldParameters.Add("description", "An in-place hold to retain emails and files of interest to Investigation 2025-101")
$HoldParameters.Add("contentQuery", $Query)
$HoldPolicy = New-MgBetaSecurityCaseEdiscoveryCaseLegalHold -EdiscoveryCaseId $Case.Id -BodyParameter $HoldParameters
Hold’u oluşturduktan sonra, Purview’un hold’u uygulayacağı bazı veri kaynakları eklemeniz gerekir. Hold’lar posta kutularına, OneDrive for Business hesaplarına, SharePoint Online sitelerine ve Microsoft 365 gruplarına (grup posta kutusu ve grup sitesi) uygulanabilir. En fazla 1.000 ayrı posta kutusu ve 100 ayrı site bekletme veri kaynağı olarak yapılandırılabilir. Bekletmeler süresizdir ve bir vakadan kaldırılıncaya kadar yürürlükte kalır.
Bu kod, bir kullanıcıyı bir saklama politikası için kaynak olarak ekler. Bir kullanıcının posta kutusunu ve OneDrive hesabını tek bir eylemde ekleyebileceğinizi belirtir; bu, bir kullanıcı veri kaynağının bir aramaya eklenmesiyle aynı işlemdir, ancak eklenen kaynaklar “posta kutusu, site” olduğunda ne Graph API ne de cmdlet çalışır. Bunun yerine, bir posta kutusu ve bir OneDrive hesabını ayrı ayrı eklemeniz gerekir. Bir tutma politikasına bir posta kutusu ve bir (OneDrive) sitesi ekleme yöntemi ise şöyledir:
$UserSource = @{}
$UserSource.Add("email", "[email protected]")
$UserSource.Add("includedSources","mailbox")
New-MgBetaSecurityCaseEdiscoveryCaseLegalHoldUserSource -EdiscoveryCaseId $Case.Id -EdiscoveryHoldPolicyId $HoldPolicy.Id -BodyParameter $UserSource
$SiteSource = @{}
$SiteSource.Add("@odata.type","microsoft.graph.security.siteSource")
$SiteSource.Add("site", @{webUrl = "https://office365itpros-my.sharepoint.com/personal/lotte_vetler_office365itpros_com"})
New-MgBetaSecurityCaseEdiscoveryCaseLegalHoldSiteSource -EdiscoveryCaseId $Case.Id -EdiscoveryHoldPolicyId $HoldPolicy.Id -BodyParameter $SiteSource
Bu yöntemle eklenen kullanıcılar eDiscovery arayüzünde veri kaynakları olarak görünmez. Ancak, yalnızca Politika eylemleri menüsünden politikayı yeniden denemek için işlem yapıldıktan sonra, tutma için ayrıntılar sekmesinde konumlar olarak listelenirler (tutma politikasını yeniden denemek için hiçbir Graph API yöntemi mevcut değildir). Microsoft, veri kaynaklarının listelenmemesinin bu metni okuduğunuzda düzeltilmiş olabilecek bir hata olduğunu kabul eder.(Hali hazırda düzeltme aşamasında olduğu bildirilmiştir)
Bir Tahmin Araması Çalıştırma
Sorgunun etkinliğini test etmek için, bazı öğeleri bulup bulamayacağımızı görmek için bir tahmin araması çalıştırmalıyız. Bu bir tahmin aramasıdır çünkü eDiscovery taranan konumlardan hiçbir şey getirmez. Bunun yerine, eDiscovery bir inceleme kümesi oluşturması veya sonuçları dışa aktarması istendiğinde kaç öğenin bulunacağını tahmin eder.
Ne yazık ki, bir tahmin araması başlatmak ve sonuçları almak için kullanılan V1.0 cmdlet’leri, V1.0 yöntemleri gibi, yanlış bilgiler döndürüyor. Bu metni okuduğunuzda sorun, güncellenmiş bir SDK cmdlet’i aracılığıyla çözülmüş olabilir. Bir tahmin araması başlatmak için, Invoke-MgBetaEstimateSecurityCaseEdiscoveryCaseSearchStatistics cmdlet’ini çalıştırın:
Invoke-MgBetaEstimateSecurityCaseEdiscoveryCaseSearchStatistics -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id
Aramalar arka plan işlemleri olarak çalışır. Tahminin herhangi bir öğeyi tanımlayıp tanımlamadığını bulmak için, bir sorgu için döndürülen son istatistik kümesini getiren
Get-MgBetaSecurityCaseEdiscoveryCaseSearchLastEstimateStatisticsOperation cmdlet’ini kullanın.
Arama Sonuçlarını Dışa Aktar
Arama sonuçlarını (veya bir inceleme setinden) dışa aktarmak eDiscovery çalışmasının önemli bir parçasıdır. Bir aramayla bulunan bilgilerin genellikle dış uzmanlar tarafından incelenmesi gerekir. eDiscovery, Entra ID B2B konuk erişimini inceleme setlerine destekler, ancak inceleme için bilgi paylaşmanın en yaygın yöntemi mesajları PST’lere ve belgeleri tek tek dosyalara dışa aktarmaktır.
İki cmdlet mevcuttur:
- Export-MgBetaSecurityCaseEdiscoveryCaseSearchResult : Bir aramanın sonuçlarını dışa aktarır ve bulunanları ayrıntılı olarak raporlar.
- Export-MgBetaSecurityCaseEdiscoveryCaseSearchReport yalnızca raporları dışa aktarır.
Bu örnek, bir arama tarafından bulunan sonuçları dışa aktarır. Dışa aktarma biçimleri parametresi, mesajların tek tek .msg dosyaları yerine PST’lere dışa aktarıldığını belirtir. Parametre değerleri hakkında daha fazla ayrıntı için microsoftun ilgili makalesi buradadır.
$ExportParameters = @{}
$ExportParameters.Add("displayName", "Export Quarantined messages")
$ExportParameters.Add("exportCriteria", "searchHits")
$ExportParameters.Add("exportformats", "pst")
$ExportParameters.Add("additionalOptions", "subfolderContents")
$ExportParameters.Add("exportLocation", "responsiveLocations")
Export-MgBetaSecurityCaseEdiscoveryCaseSearchResult -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id -BodyParameter $ExportParameters
Dışa aktarma işlemi, bir aramayla bulunan dosyaları güvenli bir Azure depolama konumuna kopyalar. İşlenecek öğe sayısına bağlı olarak, bir dışa aktarma işleminin tamamlanması uzun sürebilir. Tamamlandığında, bir eDiscovery yöneticisi dosyaları manuel olarak indirmelidir.
DisplayName özelliğinde dışa aktarma işi için bir ad belirtmek, indirilen rapor dosyalarını içeren zip dosyası için çok uzun bir dosya adı oluşturabilir. Dosyayı açmadan önce yeniden adlandırmanız gerekebilir. Bu sorun, Purview UX aracılığıyla oluşturulan dışa aktarmalar için zip dosyalarında oluşmaz.
Bir İnceleme Seti Ekleyin
Bir inceleme seti, araştırmacıların setteki öğeleri inceleyerek öğelerin ilgi çekici olup olmadığına karar vermeleri için kullanılması amaçlanan bir aramayla bulunan öğelerin statik bir kopyasıdır (veya başka bir inceleme setinden kopyalanmıştır). Araştırmacılar bir inceleme setindeki öğeleri etiketleyebilir ve ek açıklamalar ekleyebilir ayrıca seçili öğeleri harici inceleme için dışa aktarabilir.
New-MgSecurityCaseEdiscoveryCaseReviewSet cmdlet’i bir eDiscovery vakasında yeni bir inceleme seti oluşturur.
$ReviewSet = New-MgSecurityCaseEdiscoveryCaseReviewSet -EdiscoveryCaseId $Case.Id -DisplayName "Review Set for Investigation"
Bir aramayla bulunan dosyaları bir inceleme kümesine kopyalamak için
Add-MgSecurityCaseEdiscoveryCaseReviewSetToReviewSet cmdlet’ini kullanın. Kaynak aramanın tanımlayıcısı komuta atanmış değişkende saklıdır.
$ReviewSetParameters = @{}
$ReviewSetParameters.Add("additionalDataOptions", "linkedFiles")
$ReviewSetParameters.Add("search",@{id = $Search.Id})
Add-MgSecurityCaseEdiscoveryCaseReviewSetToReviewSet -EdiscoveryCaseId $Case.Id -EdiscoveryReviewSetId $ReviewSet.Id -BodyParameter $ReviewSetParameters
additionalDataOptions parametresi, inceleme kümesinin linkedfiles (Outlook veya Viva Engage Teams ile paylaşılan dosyalar) ve allVersions (SharePoint Online ve OneDrive for Business’ta depolanan dosyaların tüm kullanılabilir sürümleri) öğelerini içerip içermeyeceğini belirtir. Burada kullanılan komut allVersions seçeneğini içermez , bu nedenle Purview inceleme kümesine yalnızca dosyaların en son kullanılabilir sürümünü kopyalar.
Bir inceleme setinin doldurulması, işlenmesi gereken öğe sayısına bağlı olarak birkaç saat (veya daha uzun) sürebilir.
Öğeleri Temizleme
Temizleme yalnızca eDiscovery premium durumları için yapılabilir. SharePoint Online ve OneDrive temizlemeyi desteklemez, bu nedenle kaldırılabilen tek öğeler e-posta (“posta kutuları”) ve Teams sohbeti ve kanal mesajları (“teamsMessages”) için uyumluluk kayıtlarıdır. Posta kutusu öğeleri yumuşak bir şekilde silinebilir (“kurtarılabilir”) veya sert bir şekilde silinebilir (“kalıcı olarak Sil”). Teams uyumluluk kayıtları her zaman sert bir şekilde silinir ve bunların bir posta kutusundan kaldırılması daha sonra ilişkili mesajların Teams mesaj deposundan silinmesine yol açar.
Bu kod, Purview’a aramayla bulunan posta kutusu öğelerini kalıcı olarak kaldırmasını söyleyen bir emir oluşturur. Clear-MgSecurityCaseEdiscoveryCaseSearchData cmdlet’i daha sonra temizleme komutunu Exchange Online’a gönderir.
$PurgeParameters = @{}
$PurgeParameters.Add("purgeType","permanentlyDelete")
$PurgeParameters.Add("purgeAreas","Mailboxes")
Clear-MgSecurityCaseEdiscoveryCaseSearchData -EdiscoveryCaseId $Case.Id -EdiscoverySearchId $Search.Id -BodyParameter $PurgeParameters
-ResponseHeadersVariable Response
İstek temizleme işinin ayrıntılarını içerir. İşin ayrıntılarını almak için ise
Invoke-MgGraphRequest‘i kullanın. Bu örnekte, döndürülen veriler temizlemenin başarılı olduğunu söyler.
[string]$ResponseLocationURI = $Response.Location
$ResponseURI = [system.uri]$ResponseLocationURI
Invoke-MgGraphRequest -Uri $ResponseURI -Method Get
Name Value
---- -----
createdDateTime 05/06/2025 13:44:58
id f580a3b0c72b4c849912520e04bc39e7
percentProgress 100
action purgeData
status succeeded
completedDateTime 05/06/2025 13:47:23
Aramaların birincil ve arşiv posta kutularına, her posta kutusundaki kurtarılabilir öğeler yapısı dahil olmak üzere yapıldığını unutmayın. Bulunan öğeler kullanıcılar tarafından görülebilir veya görülemez olabilir. Örneğin, bazı istenmeyen iletileri temizlemek istediğinizi varsayalım. Bir temizleme, konum başına en fazla 100 öğeyi kaldırabilir. Bu öğeler arama tarafından bulunan sırayladır. Bir posta kutusunda 200 eşleşen ileti varsa ve bunların çoğu Kurtarılabilir Öğeler’deki Silinenler klasöründeyse, temizleme 100 öğeyi Silinenler’den Temizlenenler klasörüne taşıyabilir ve posta kutusu sahibinin görebildiği öğelere asla dokunmayabilir.
Bu tarz bir API aracılığıyla verilerle çalışmanın güzel tarafı, bir uygulamanın nasıl çalıştığına dair daha iyi bir anlayışa sahip olmanızdır. eDiscovery API elbette mükemmel değildir, ancak eDiscovery vaka işlemenin birçok özelliğini kendinize göre otomatikleştirebilirsiniz. Ayrıca bu özelliklerin microsoft tarafından sürekli güncellendiğini ve tespit edilen hataların giderilmesi için sürekli çalışma halinde olduğunu da unutmayınız.
Saygılarımla.








Eline sağlık.