PowerShell ile E-postalarda Nasıl Arama Yapılır?


Exchange Online posta kutularındaki iletileri aramanın mükemmel bir yöntemi PowerShell'dir. Komutları beğeninize göre ayarlayabilir ve ihtiyacınız olan sonuçları alabilirsiniz. Ayrıca sonuçların CSV dosyasına aktarılması harikadır, böylece orada filtreleyebilirsiniz. Bu makalede PowerShell ile e-postalarda nasıl arama yapacağınızı öğreneceksiniz.

Microsoft Graph PowerShell'i yükleyin

Windows PowerShell'i yönetici olarak çalıştırın ve Microsoft Graph PowerShell'i yükleyin.

Install-Module Microsoft.Graph -Force
Install-Module Microsoft.Graph.Beta -AllowClobber -Force

Önemli: Her zaman Microsoft Graph PowerShell ve Microsoft Graph Beta PowerShell modüllerini yükleyin. Bunun nedeni, bazı cmdlet'lerin henüz son sürümde mevcut olmaması ve çalışmayacak olmasıdır. Hataları ve yanlış sonuçları önlemek için bir cmdlet'i veya betiği çalıştırmadan önce her iki modülü de en son sürüme güncelleyin.

Microsoft Entra'da uygulama kaydını yapılandırma

Komutları veya betikleri çalıştırmadan önce, Microsoft Graph PowerShell ile kimlik doğrulaması yapmak için öncelikle doğru izinlere ve istemci sırrına sahip bir uygulama kaydı oluşturmanız gerekir.

1. Yeni uygulamayı kaydedin

Microsoft Entra ID'ye yeni bir uygulama kaydedin:

  1. Microsoft Entra yönetim merkezinde oturum açın
  2. Kimlik > Uygulama > Uygulama kayıtları'nı tıklayın
  3. Yeni Kayıt'ı tıklayın

  1. Uygulamaya Arama-Posta adını verin
  2. Yalnızca bu kuruluş dizinindeki hesaplar (yalnızca EXOIP - Tek kiracı)'yı seçin
  3. Kaydol'u tıklayın

Posta Arama uygulaması başarıyla oluşturuldu. Daha sonra Microsoft Graph PowerShell'e bağlanırken ihtiyacınız olacağı için aşağıdaki değerleri kopyalayıp Not Defteri'ne yapıştırın.

  1. Uygulama (istemci) kimliğini kopyalayın
  2. Dizin (kiracı) kimliğini kopyalayın

2. API izinlerini atayın

Önceki adımda kaydettiğiniz uygulama için API izinlerini atayın:

  1. API izni'ni tıklayın
  2. İzin ekle'yi tıklayın

  1. Microsoft API'leri'ni tıklayın
  2. Microsoft Graph'ı tıklayın

  1. Uygulama izinleri'ni tıklayın
  2. User.Read.All'u arayın
  3. Kullanıcılar > Kullanıcı.TümünüOku'yu seçin

  1. Mail.Read'i arayın
  2. Posta > Posta.Oku'yu seçin
  3. İzin ekle'yi tıklayın

API izinleri başarıyla eklendi. Bir sonraki adım yönetici izni vermektir.

3. Yönetici onayı verin

Önceki adımda seçtiğiniz izinler için yönetici izni vermelisiniz:

  1. EXOIP için yönetici izni ver'i tıklayın
  2. Evet'i tıklayın

  1. Yeşil onay işareti, yönetici iznini başarıyla verdiğinizi gösterir

4. Müşteri Sırrı Oluşturun

Microsoft Entra'da yeni bir uygulamayı kaydettikten, API izinlerini atadıktan ve yönetici onayı verdikten sonra bir istemci sırrı oluşturmanız gerekir.

Microsoft Entra ID'de uygulamanız için bir İstemci Gizli Anahtarı oluşturmak için şu adımları izleyin:

  1. Sertifikalar ve sırlar'ı tıklayın
  2. Müşteri sırları > Yeni istemci sırrı'nı tıklayın
  3. Açıklama yazın
  4. Bir Son kullanma tarihi seçin
  5. Ekle'yi tıklayın

Not: Müşteri Sırrı'nın son geçerlilik tarihi maksimum 24 ay (2 yıl) olabilir. PowerShell ile Microsoft Entra ID'deki İstemci Gizli Anahtarını istediğiniz zaman yenileyebilirsiniz.

  1. İstemci Sırrı değerini kopyalayın ve Not Defteri'ne kaydedin

İstemci Sırrı ile Microsoft Graph PowerShell'e bağlanın

MS Graph PowerShell'e Client Secret ile bağlanmak için aşağıdaki parametre değerlerini değiştirmeniz gerekir:

  • 2. satıra Uygulama İstemci Kimliği değerini yazın
  • Dizin Kiracı Kimliği değerini 3. satıra yazın
  • Müşteri Sırrı değerini değerini 4. satıra yazın

Aşağıdaki PowerShell betiğini çalıştırın.

# Configuration
$ClientId = "c6787ff5-08ec-4e96-b4d2-1d1782303310"
$TenantId = "eb403171-a4ec-4d98-a08f-1876318c9deb"
$ClientSecret = "6_q8Q~X9e-fjwWhVVP_WWx~ua4JMI.BWkI7Q7b7B"

# Convert the client secret to a secure string
$ClientSecretPass = ConvertTo-SecureString -String $ClientSecret -AsPlainText -Force

# Create a credential object using the client ID and secure string
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ClientId, $ClientSecretPass

# Connect to Microsoft Graph with Client Secret
Connect-MgGraph -TenantId $tenantId -ClientSecretCredential $ClientSecretCredential

Belirli bir kullanıcıya ait e-postaları arayın

Belirli bir kullanıcıdan gelen tüm mesajları alın.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Belirli bir kullanıcıdan okunan tüm mesajları alın.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq true" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Belirli bir kullanıcıdan gelen okunmamış tüm mesajları alın.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq false" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Tarihteki e-postaları arayın

Belirli bir tarihten sonra belirli bir kullanıcıdan gelen e-postaları arayın.

$User = "Amanda.Morgan@exoip.com"
$Date = "2024-01-01"

Get-MgUserMessage -All -UserId "$User" -Filter "ReceivedDateTime gt $Date" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Konuyla ilgili e-postaları arayın

Belirli bir konuyla başlayan e-postaları arayın.

$Subject = "The subject"
$user = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "startswith(Subject,'$Subject')" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Konuya uygun e-postaları arayın.

$Subject = "The specific subject"
$user = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$user" -Filter "Subject eq '$Subject'" | 
Select-Object Subject, InternetMessageId, ReceivedDateTime, 
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } | 
Out-GridView

Son 30 güne ait e-postaları arayın

Kuruluştaki son 30 güne ait, alıcı ve gönderen tüm e-postaları arayalım. Sonuçlar Out-GridView'da görünecek ve bir CSV dosyasına aktarılacaktır.

Kuruluştaki son 30 güne ait tüm e-postaları arayın.

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            $Data += [PSCustomObject]@{
                ReceivedDateTime  = $message.ReceivedDateTime
                Subject           = $message.Subject
                Sender            = $message.Sender.EmailAddress.Address -join ','
                Recipient         = $message.ToRecipients.EmailAddress.Address -join ','
                InternetMessageId = $message.InternetMessageId
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\All_emails.csv" -NoTypeInformation -Encoding utf8

Son 30 gün içinde belirli bir alıcıya gönderilen kuruluştaki tüm e-postaları arayın.

# Email address of the recipient you want to filter
$recipientEmailAddress = "amanda.morgan@exoip.com"

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            # Check if the recipient matches the desired email address
            if ($message.ToRecipients.EmailAddress.Address -eq $recipientEmailAddress) {
                $Data += [PSCustomObject]@{
                    ReceivedDateTime  = $message.ReceivedDateTime
                    Subject           = $message.Subject
                    Sender            = $message.Sender.EmailAddress.Address
                    Recipient         = $message.ToRecipients.EmailAddress.Address
                    InternetMessageId = $message.InternetMessageId
                }
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Recipient_emails.csv" -NoTypeInformation -Encoding utf8

Kuruluşunuzda son 30 gün içinde belirli bir gönderenden gönderilen tüm e-postaları arayın.

# Email address of the sender you want to filter
$senderEmailAddress = "john.doe@gmail.com"

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            if ($message.Sender.EmailAddress.Address -eq $senderEmailAddress) {
                $Data += [PSCustomObject]@{
                    ReceivedDateTime  = $message.ReceivedDateTime
                    Subject           = $message.Subject
                    Sender            = $message.Sender.EmailAddress.Address
                    Recipient         = ($message.ToRecipients.EmailAddress.Address -join ',')
                    InternetMessageId = $message.InternetMessageId
                }
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Sender_emails.csv" -NoTypeInformation -Encoding utf8

İşte bu!

Devamını oku: Entra ID uygulama kayıtlarını dışa aktar Sertifikalar ve Sırlar geçerlilik sonu raporu »

Çözüm

PowerShell ile e-postalarda nasıl arama yapacağınızı öğrendiniz. Öncelikle Microsoft Entra'da doğru izinlere sahip bir uygulama kurun. Daha sonra Microsoft Graph PowerShell ile uygulamaya bağlanın. Son olarak PowerShell ile e-postaları aramak için komutları çalıştırın.

Bu makaleyi beğendiniz mi? Ayrıca Microsoft 365'te Üst Düzey Etki Alanı (TLD) Nasıl Engellenir konusunu da beğenebilirsiniz. Bizi takip etmeyi ve bu makaleyi paylaşmayı unutmayın.

İlgili makaleler