How to collect Outlook rules using Powershell

Πως να συλλέξετε τους κανόνες του Outlook χρησιμοποιώντας Powershell

· Coding Προγραμματισμός Cybersecurity Κυβερνοασφάλεια · tool εργαλείο powershell powershell outlook outlook

IntroductionΕισαγωγή

In some cases, there is a need to collect specific rules from the Outlook client app. For example, a company may want to know if -and where- its employees forward the corporate e-mails. There are two types of rules in Outlook:

Σε μερικές περιπτώσεις, υπάρχει ανάγκη να συλλέξουμε συγκεκριμένους κανόνες από την εφαρμογή του Outlook. Για παράδειγμα, μια εταιρεία μπορεί να θέλει να ξέρει αν -και που- οι υπαλληλοί της προωθούν τα εταιρικά μηνύματα ηλεκτρονικού ταχυδρομίου. Υπάρχουν δύο τύποι κανόνων στο Outlook:

Server-side rules: They use conditions and actions that can be handled by the Exchange server and thus, their execution is performed by the server alone when receiving an email (it is irrelevant if the client app is running or not). Rules created using the Outlook Web App (OWA) are always server-side rules.

Κανόνες στην πλευρά του διακομιστή: Χρησιμοποιύν συνθήκες και ενέργειες που μπορεί να διαχειριστεί ο διακομιστής Exchange και ως εκ τούτου η εκτέλεσή τους γίνεται μονάχα από τον διακομιστή όταν λαμβάνεται το μήνυμα του ηλεκτρονικού ταχυδρομίου (άσχετα από το αν τρέχει η εφαρμογή-πελάτης). Κανόνες που δημιουργούνται μέσα από το Outlook Web App (OWA) είναι πάντοτε κανόνες στην πλευρά του διακομιστή.

Client-side rules: They have at least one condition or action that uses an Outlook feature. Their execution is performed by the Outlook client and only if -and when- the Outlook client is running. They will not work if an e-mail is accessed from a different e-mail client app. These rules are marked with the "client-only" status in the Outlook user interface. The only way to audit these rules is to ask them from the Outlook client app.

Κανόνες στην πλευρά του πελάτη: Περιέχουν τουλάχιστον μια συνθήκη ή ενέργεια που χρησιμοποιεί κάποιο χαρακτηριστικό του Outlook. Η εκτέλεσή τους γίνεται από την εφαρμογή του Outlook και μόνο αν -και όταν- τρέχει η εφαρμογή του Outlook. Δε θα δουλέψουν αν το μήνυμα του ηλεκτρονικού ταχυδρομείου ληφθεί από μια διαφορετική εφαρμογή. Αυτοί οι κανόνες σημαίνονται με την ένδειξη "client-only" στην διεπαφή χρήστη του Outlook. Ο μόνος τρόπος για να επιθεωρήσετε αυτούς τους κανόνες είναι να τους ζητήσετε από την εφαρμογή του Outlook.

Outlook client-only rule

CodeΚώδικας

Here, we present a powershell sample script which collect the forwarding and redirecting rules from an Outlook client app. There are some ways to run such a script on multiple workstations, depending on your infrastructure. For example, you can use a Group Policy to run it via the Domain (in this case you need some kind of Domain-accessible storage where you will upload the output from the script).

Εδώ, παρουσιάζουμε ένα δείγμα σεναρίου powershell, το οποίο συλλέγει τους κανόνες προώθησης και ανακατεύθυνσης από μια εφαρμογή Outlook. Υπάρχουν μερικοί τρόποι για να τρέξετε ένα τέτοιο σενάριο σε πολλαπλούς σταθμούς εργασίας, ανάλογα την υποδομή σας. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε μια Πολιτική Ομάδας (Group Policy) για να το τρέξετε μέσω του Τομέα (Domain) (σε αυτήν την περίπτωση θα χρειαστείτε κάποιου είδους χώρο αποθήκευσης, προσβάσιμο από τους σταθμούς εργασίας του Τομέα, για να ανεβάσετε την έξοδο από το σενάριο).

#Requires -version 2.0
#Author: Alamot
Add-Type -AssemblyName microsoft.office.interop.outlook
$outlook = New-Object -ComObject outlook.application
$namespace = $Outlook.GetNameSpace("mapi")


# See https://docs.microsoft.com/en-us/office/vba/api/outlook.olruleactiontype
$ACTIONS_TO_GRAB = @(6, 7, 8)
# 6 => olRuleActionForward
# 7 => olRuleActionForwardAsAttachment
# 8 => olRuleActionRedirect


[Hashtable[]]$records = $null


ForEach ($store in $namespace.Stores) {

  $records += @{} 
  $records[-1]['CurrentUser'] = $namespace.CurrentUser.Name 
  $records[-1]['DisplayName'] = $store.DisplayName
  $records[-1]['FilePath'] = $store.FilePath
  $records[-1]['Rules'] = $()
    
  $rules = $store.GetRules() 

  ForEach ($rule in $rules) {

    if ($rule.Enabled) {

      $actions_to_grab_found = 0
      ForEach ($action in $rule.Actions) {
          if ($action.Enabled -and ($ACTIONS_TO_GRAB -contains $action.ActionType)) {        
              $actions_to_grab_found = 1
          }
      }

      if ($actions_to_grab_found -eq 1) { 

        $records[-1]['Rules'] += , @{}
        $records[-1]['Rules'][-1]['name'] = $rule.Name  
        $records[-1]['Rules'][-1]['conditions'] = @()
        $records[-1]['Rules'][-1]['actions'] = @()
  
        ForEach ($condition in $rule.Conditions) {
          if ($condition.Enabled) { 
            # See https://docs.microsoft.com/en-us/office/vba/api/outlook.olruleconditiontype 
            $s = "type:" + $condition.ConditionType.toString()
            if ("Text" -in $condition.PSobject.Properties.Name) {
              $s += ", text:" + $condition.Text;
            }
            if ("Recipients" -in $condition.PSobject.Properties.Name) {
              $s += ", recipients:" +
                    (($condition.Recipients | select -expand Name) -join ';') 
            }
            $records[-1]['Rules'][-1]['conditions'] += , $s
          }
        }
  
        ForEach ($action in $rule.Actions) {
          if ($action.Enabled -and ($ACTIONS_TO_GRAB -contains $action.ActionType)) {                        
            $s = "type:" + $action.ActionType.toString() + ", recipients:" +
                 (($action.Recipients | select -expand Name) -join ';')
            $records[-1]['Rules'][-1]["actions"] += , $s
          }
        }   

      }

    }

  }

}

$records | ConvertTo-Json -Depth 10

# Uncomment the following lines and set the proper path to write the output into a file
# $outfile = join-path -path "\\TCOM2-SERVER\shared" -childpath $($env:COMPUTERNAME + "-" + $(Get-Date -UFormat "%Y-%m-%d") + ".json")
# $records | ConvertTo-Json -Depth 10 | Set-Content $outfile 

Sample outputΔείγμα εξόδου

[
  {
    "Rules": [
      {
        "name": "Test Rule 1",
        "actions": [
          "type:7, recipients:dasda@a.gr;lala@da.com",
          "type:8, recipients:tam@tata.com;dude@dude.com"
        ],
        "conditions": [
          "type:4"
        ]
      },
      {
        "name": "Test Rule 2",
        "actions": [
          "type:6, recipients:bbb@aaa.com"
        ],
        "conditions": [
          "type:6",
          "type:1, recipients:someone@outlook.com;aaa@bbb.com",
          "type:7",
          "type:8"
        ]
      },
      {
        "name": "Test Rule 3",
        "actions": [
          "type:6, recipients:someone@gmail.com;meme@meme.com"
        ],
        "conditions": [
          "type:2, text:free cash",
          "type:22"
        ]
      }
    ],
    "FilePath":"C:\\Users\\Bob\\AppData\\Local\\Microsoft\\Outlook\\someone@outlook.com.ost",
    "DisplayName": "someone@outlook.com",
    "CurrentUser": "someone@outlook.com"
  },
  {
    "Rules": null,
    "FilePath": "",
    "DisplayName": "someone@gmail.com",
    "CurrentUser": "someone@outlook.com"
  }
]

For Action type codes, see: https://docs.microsoft.com/en-us/office/vba/api/outlook.olruleactiontype

For Condition type codes, see: https://docs.microsoft.com/en-us/office/vba/api/outlook.olruleconditiontype

Download scriptΚατέβασμα σεναρίου

You can download this script from here: get_outlook_forwarding_rules.ps1

Μπορείτε να κατεβάσετε αυτό το σενάριο απο εδώ: get_outlook_forwarding_rules.ps1

See also...

Δείτε επίσης...