Search-Mailbox ile Exchange kullanıcı posta kutularındaki iletileri arama ve silme

Okuma süresi - 7 dk.


Exchange Server, Exchange adminlerinin veritabanlarındaki kullanıcı posta kutularını aramasına ve belirli e-postaları veya diğer öğeleri posta kutularından silmesine olanak tanır. Örneğin, bir kullanıcı yanlışlıkla bir şirketteki diğer kullanıcılara gizli veriler gönderdi. Bilgi güvenliği departmanı, Exchange yöneticisi olarak bu e-postayı tüm kullanıcıların posta kutularından silmenizi isteyebilir.

Kullanıcı posta kutularındaki e-posta öğelerini aramak için, tüm veya belirli posta kutularındaki belirli ölçütleri karşılayan öğeleri aramanıza, bulunan öğeleri başka bir posta kutusuna kopyalamanıza veya kaldırmanıza olanak sağlayan Search-Mailbox cmdlet’ini kullanabilirsiniz.

Bu makalede, Exchange kullanıcı posta kutularını farklı ölçütlere göre aramak ve belirli kullanıcının veya tüm Exchange kullanıcılarının posta kutusundan belirli e-postaları silmek için PowerShell‘in nasıl kullanılacağını göstereceğiz. Aşağıda açıklanan teknikler Exchange 2016, 2013 ve 2010 için geçerlidir.

Exchange posta kutuları üzerinden arama izinleri nasıl atanır?

Posta kutusu öğelerini arayan ve silen kullanıcı hesabına aşağıdaki roller atanmalıdır.

  • Mailbox Import Export
  • Mailbox Search

Rolleri EAC üzerinden ya da aşağıdaki PowerShell komutlarını kullanarak atayabilirsiniz.

New-ManagementRoleAssignment -User ozgur.ozocak -Role “Mailbox Import Export”
New-ManagementRoleAssignment -User ozgur.ozocak -Role “Mailbox Search”

Roller atandıktan sonra Exchange Management Shell’i yeniden başlatın.

Exchange kullanıcı posta kutularındaki iletileri aramak ve silmek için Search-Mailbox’ı kullanma

Exchange Control Panel veya Exchange Admin Center’i kullanarak kullanıcı posta kutularındaki e-posta öğelerini arayabilirsiniz, ancak bu arama yöntemi oldukça yavaştır ve e-posta iletilerini silmenize izin vermez. PowerShell kullanarak arama yapmak çok daha kolaydır.

Her şeyden önce, Search-Mailbox cmdlet’ini kullanarak bir e-postayı nasıl bulacağımıza bakalım.

Belirli bir konuyu içeren öğeleri aramak için aşağıdaki komutu çalıştırın.

Search-Mailbox -Identity ozgur.ozocak -SearchQuery ‘Subject:”Satış Raporu”‘

Exchange organizasyonundaki tüm posta kutularını aramak için aşağıdaki komutu kullanın.

Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery ‘Subject:”Satış Raporu”‘

Arama sonuçlarını belirli bir posta kutusuna ve klasöre kopyalamak için TargetMailbox veya TargetFolder parametrelerini kullanın. Böylece, arama tamamlandıktan sonra, Outlook veya OWA kullanarak bulunan öğeleri görüntüleyebilirsiniz. Kullanıcı listesinde (users.txt dosyasında verilen) e-posta mesajlarını aramanız ve bulunan öğeleri belirli posta kutusundaki klasöre kopyalamanız gerektiğini varsayalım. Bunu yapmak için şu komutu çalıştırın.

get-content users.txt | Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery ‘Subject:”Satış Raporu”‘ -TargetMailbox sec_dept -TargetFolder “ExchSearchResult”

LogOnly → Bu bağımsız değişken kullanılırsa, arama sonuçlarını içeren bir rapor belirtilen hedef posta kutusuna gönderilir. Rapor, arama ölçütlerini karşılayan posta kutularını listeleyen arşivlenmiş bir CSV dosyasıdır.

EstimateResultOnly → Bu bağımsız değişkeni kullanırken hedef posta kutusu veya klasör belirtmeniz gerekmediğini lütfen unutmayın.

Bulunan e-posta iletilerini kaldırmak için -deletecontent parametresini ve silme için onay isteğini atlamak için ise -Force parametresini kullanabilirsiniz.

Belirli bir Exchange sunucusundaki tüm posta kutularında ozgur.ozocak@teknolojikadam.com adresinden gönderilen tüm e-posta mesajlarını silelim.

Get-Mailbox –Server EXCH01 –ResultSize unlimited | Search-Mailbox -SearchQuery ‘from:”ozgur.ozocak@teknolojikadam.com”‘ –DeleteContent –Force

DeleteContent parametresini kullanarak posta kutularından iletileri silmeden önce, bulunan e-postalara -EstimateResultOnly veya –LogOnly bağımsız değişkenlerini kullanarak tekrar incelemenizi öneririm.

Yalnızca silinen öğeler arasında arama yapmak için –SearchDumpsterOnly parametresini de kullanabilirsiniz. Silinen öğelerdeki iletilieri aramadan hariç tutmak için -SearchDumpster:$false değişkenini komuta ekleyin. Bir arşiv posta kutusunu arama sonucundan hariç tutmanız gerekiyorsa –DoNotIncludeArchive parametresini kullanabilirsiniz.

Search-Mailbox: Search Query örnekleri

SearchQuery parametresini kullanarak e-posta iletilerini bulmak için query örneklerini ele alalım. SearchQuery anahtarı, KQL’deki (Keyword Query Language) sorguları işler. Ayrıntılı bilgi için Microsoft’un dökümanlarına göz atabilirsiniz.

https://docs.microsoft.com/en-us/sharepoint/dev/general-development/keyword-query-language-kql-syntax-reference

E-posta konusundaki “Secret” anahtar kelimesini içeren tüm e-posta mesajlarını tüm kullanıcılardan kaldırmak için aşağıdaki komutu kullanabilirsiniz.

Search-Mailbox -Identity ozgur.ozocak -SearchQuery ‘Subject:”Secret” and from<>”teknolojikadam.com”’ -DeleteContent

Ekleri 20 MB’ı aşan tüm e-postaları bulup silebilirsiniz.

Search-Mailbox -Identity ozgur.ozocak -SearchQuery ‘hasattachment:true AND Size >20971520’ –DeleteContent

İpucu → E-posta öğelerinin boyutu bayt olarak belirtilir ve yalnızca eklerin değil, tüm iletinin boyutu sayılır. Ayrıca megabayt cinsinden boyutunu belirtebilirsiniz ve bu durumda komut şu şekilde kullanılır. -SearchQuery {Size -gt 30MB}

E-postanın konusundaki ve gövdesindeki metni aynı anda arayabilirsiniz. Örneğin, konudaki “Rapor” veya e-posta gövdesinde “fatura” içeren tüm iletileri bulalım ve silelim.

Search-Mailbox ozgur.ozocak -SearchQuery {Subject:”RE:Rapor” OR body:”fatura”} -DeleteContent -Force

Kind bağımsız değişkenini kullanarak posta kutularında belirli öğeler için arama yapabilirsiniz.

Örneğin;

  • Meetings: -SearchQuery “Kind:meetings”
  • Contacts: -SearchQuery “Kind:contacts”

Veya diğer Outlook öğeleri için;

  • Email
  • Meetings
  • Tasks
  • Notes
  • Docs
  • Journals
  • Contacts
  • IM

Belirli bir alıcıya veya gönderene göre e-postalarda arama yapmak için;

-SearchQuery ‘from:”ceo@teknolojikadam.com” AND to:”support-team@teknolojikadam.com”‘

Belirli bir dosyaya sahip iletileri ek olarak arayabilirsiniz.

-SearchQuery ‘attachment:”satış_raporu2018.pdf”‘

Veya dosya türüne göre;

-SearchQuery ‘attachment -like:”*.docx”‘

Tarihe göre arama yapabilirsiniz. Ancak dikkat etmeniz gereken bazı nüanslar vardır. Tarihi arama kriteri olarak kullanırken, Exchange sunucunuzun bölgesel ayarlarını göz önünde bulundurmalısınız. Örneğin, 10 Nisan 2019 tarihini içeren bir arama yapacaksanız eğer aşağıdaki formatlardan birini seçebilirsiniz.

  • 10/04/2019
  • 04/10/2019
  • 10-Apr-2019
  • 10/April/2019

Ayrıca Search-Mailbox komutunu çalıştırırken, “The KQL parser threw an exception…” hatasını görürseniz, yanlış tarih biçimini kullandığınız anlamına gelir.

Belirli bir günde gönderilen e-postaları aramak için şu sorguyu kullanın.

-SearchQuery sent:04/10/2019

Belirtilen süre içinde alınan mesajları arıyorsanız ve tarih aralığını belirtmeniz gerekiyorsa kullanmanız gereken komut aşağıdaki gibi olmalıdır.

-SearchQuery {Received:04/01/2019..04/11/2019}

9 Mayıs’tan önce alınan e-postaları görüntülemek için ise çalıştırmamız gereken komut;

-SearchQuery {Received:> $(’05/09/2018′)}

Search-Mailbox Cmdlet Restrictions

Search-Mailbox cmdlet’inin önemli bir sınırlaması vardır. Yalnızca 10.000 öğe döndürebilir. Bu sınır aşılırsa eğer aşağıdaki hata mesajıyla karşılaşırsınız.

“Sending data to a remote command failed with the following error message: The total data received from the remote client exceeded allowed maximum. Allowed maximum is 524288000.”

Daha fazla e-posta öğesini silmek için, Search-Mailbox cmdlet’ini birkaç kez çalıştırmanız veya posta kutularını posta kutusu veritabanlarına veya Exchange sunucularına göre gruplara ayırmanız gerekir.

Get-Mailbox -Database Ank-ex1 | Search-Mailbox –SearchQuery ‘from:spam@spambot.org’ -DeleteContent –Force

Başka bir Search-Mailbox sorunu düşük performanstır. Büyük bir şirket olması durumunda, arama birkaç gün sürebilir.

New-ComplianceSearch kullanarak Exchange 2016’da e-postaları hızlı bulma ve silme

Exchange 2016’da, kullanıcı posta kutularındaki e-posta iletilerini hızlı bir şekilde bulmanızı ve silmenizi sağlayan yeni bir yol ortaya çıktı.

Bu komutları kullanarak arama alanını önemli ölçüde daraltabilirsiniz.

New-ComplianceSearch -Name FastSearch1 -ExchangeLocation all -ContentMatchQuery ‘from:”xyz@gmail.com”‘
Start-ComplianceSearch -Identity FastSearch1

Bu komut birkaç dakika için birkaç bin posta kutusunda arama yapabilir.

Ardından, arama ölçütlerini karşılayan posta kutularının listesini almanız gerekir.

$search = Get-ComplianceSearch –Identity FastSearch1
$results = $search.SuccessResults
$mbxs = @()
$lines = $results -split ‘[\r\n]+’
foreach ($line in $lines)
{
if ($line -match ‘Location: (\S+),.+Item count: (\d+)’ -and $matches[2] -gt 0)
{
$mbxs += $matches[1]
}
}

Artık yalnızca bu posta kutularında, Search-Mailbox cmdlet’ini kullanarak e-postaları kaldırabilirsiniz.

$mbxs | Get-Mailbox| Search-Mailbox -SearchQuery ‘from:”xyz@gmail.com”‘ -DeleteContent –Force

Şimdi silebilirsiniz.

Remove-ComplianceSearch –Identity FastSearch1