blog.icewolf.ch

Let's talk about IT!
posts - 1753, comments - 295, trackbacks - 0

My Links

Archives

Post Categories

icewolf

Sunday, April 4, 2021

Use Azure Automation for Exchange Online PowerShell Script - Part 2

Hallo zusammen,

Nach dem ersten Teil des Artikels, folgt nun der zweite.

Ich wollte noch ein paar Komponenten dazufügen:

  • Import CSV von einem Azure Storage
  • Ein Logfile erstellen und in Azure Storage abspeichern

Als einfaches Beispiel habe ich das cmdlet Set-CASMailbox genommen, bei dem ein paar Mailboxen über ein CSV exkludiert werden sollten

Zuerst einmal müssen die Variablen für Storage Account und Storage Key erfasst werden. Den Storage Key kann man Encrypted abspeichern.

Diese Variablen lassen sich einfach im Script wieder auslesen

$StorageAccountName = Get-AutomationVariable -Name "StorageAccountName"
"StorageAccountName --> $StorageAccountName"

$StorageAccountKey = Get-AutomationVariable -Name "StorageAccountKey"
"StorageAccounKey --> $StorageAccountKey"

Danach habe ich das ganze Script geschrieben:

"Getting Variables"
$StorageAccountName = Get-AutomationVariable -Name "StorageAccountName"
#"StorageAccountName --> $StorageAccountName"

$StorageAccountKey = Get-AutomationVariable -Name "StorageAccountKey"
#"StorageAccounKey --> $StorageAccountKey"

#Connecting to Exchange Online...
"Connecting to Exchange Online..."
$connection = Get-AutomationConnection –Name AzureRunAsConnection
$tenant = "icewolfch.onmicrosoft.com"
Connect-ExchangeOnline –CertificateThumbprint $connection.CertificateThumbprint –AppId $connection.ApplicationID –ShowBanner:$false –Organization $tenant

#Create Logfile
$logfile = (get-date).ToString("yyyyMMdd_hhmm") + ".log"
$LogPath = $env:temp + "\$logfile"
Add-Content -Path $LogPath "Starting Script"

#Download CSV from Azure Storage
"Download CSV from AzureStorage"
$DestinationFile = $env:temp + "\CASMailboxExclude.csv"
$StorageContext = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
Get-AzureStorageFileContent -ShareName "csv" -Path "/CASMailboxExclude.csv" -Context $StorageContext -Destination $DestinationFile

#Import CSV
$CSV = Import-CSV -Path $DestinationFile
$ExcludeArray = $CSV.Email
#"ExcludeArray..."
#$ExcludeArray

#Loop through Mailboxes
$CASMBX = Get-CASMailbox
Foreach ($MBX in $CASMBX)
{
 $Email = $MBX.PrimarySmtpAddress
 #Write-Host "Email: $Email"
    "Email: $Email"
 If ($ExcludeArray -match $Email)
 { 
  #Write-Host "$Email is in the ExcludeArray" -foregroundColor yellow
  "$Email is in the ExcludeArray"

 } else {
  Set-CASMailbox -Identity $Email -PopEnabled $false -ImapEnabled $false -SmtpClientAuthenticationDisabled $true
 }
}

Add-Content -Path $LogPath "Done"

#Upload Logfile
"Upload Logfile to AzureStorage"
Set-AzureStorageFileContent -ShareName "csv" -Path "/$logfile" -Context $StorageContext -Source $LogPath

Wie man sieht, hat das Script POP3, IMAP und SMTPAUTH überall dort deaktiviert, wo es möglich ist.

Und auch die Logfiles wurden auf dem Azure Storage abgelegt.

Grüsse
Andres Bohren

posted @ Monday, April 5, 2021 2:47 PM | Filed Under [ Exchange Azure ]

Use Azure Automation for Exchange Online PowerShell Script - Part 1

Hallo zusammen,

Stellt euch mal folgendes Szenario vor:

Ein Kunde hat einen Microsoft 365 Tenant und Cloud Only Identities. Es gibt also keine OnPrem Active Directory und Exchange Server mehr, auf welchen noch irgendwelche Scripts für die Automatisierung oder regelmässige Scripts für Exchange Online laufen könnten.

Ich habe mir mal Azure Automation angeschaut und versucht damit ein Script gegen Exchange Online laufen zu lassen.

Als erstes muss man einen Azure Automation Service erstellen

Der Automation Account braucht einen Namen, eine Subscription und eine ResourceGroup

Das erstellen vom RunAsAccount ist fehlgeschlagen (weil ich im AzureAD mit meinem Benutzer keine Rechte habe eine Azure AD Application anzulegen)

Der Automation Account wurde jedoch erstellt und drei Demo Runbooks noch dazu

Der RunAsAccount kann dann erstellt werden, wenn man genügend Rechte im AzureAD hat (Application Administrator müsste da eigentlich genügen. Ich hatte mir jedoch die Global Admin Permissions gegeben).

Schaut man sich nun die Azure AD Applikation an, so braucht die natürlich noch ein paar Rechte um auf Exchange zugreifen zu dürfen

Wie man zur  "Exchange.ManageAsApp" Berechtigung kommt, habe ich im folgenden Artikel beschrieben.

Exchange Online PowerShell V2 Authentication with App in AzureAD (Update)
https://blog.icewolf.ch/archive/2021/04/04/exchange-online-powershell-v2-authentication-with-app-in-azuread-update.aspx

Im Privileged Identity Management (PIM) habe ich der App noch die "Exchange Administrator" Rechte permanent verliehen.

Zurück zum Azure Automation Account. Ich schaue mir mal das PowerShell Beispiel genauer an

Mit dem Klick auf "Edit" kommt man zum Quellcode vom Script

Klickt man dann auf die "Test pane"

Kann das Script mit dem "Play" Button ausgeführt werden.

Da ich ja ein PowerShell Script für Exchange Online ausführen will, brauche ich noch das entsprechende PowerShell Module. Dazu wählt man links in der Navigation "Modules" aus, und wählt dann "Browse Gallery".

Dort kann man dann nach dem gewünschten Modul suchen. In meinem Fall "ExchangeOnlineManagement"

Das Modul wird dann importiert

Nun bin ich bereit, mein eigenes Runbook anzulegen

Das Runbook benötigt einen Namen und einen Typ (Programmiersprache)

Ich habe ein kleines Script geschrieben, welche sich über die Azure Application und einem Zertifikat (Wird vom RunAsAccount automatisch erstellt) mit Exchange Online verbindet.

"Check Module"
$Module = Get-Module -Name ExchangeOnlineManagement -ListAvailable
If ($Module -eq $Null)
{
    "ExchangeOnlineManagement Module not installed"
else {
    "ExchangeOnlineManagement Module found"
}


"Connecting to Exchange Online..."
$connection = Get-AutomationConnection –Name AzureRunAsConnection
$tenant = "icewolfch.onmicrosoft.com"
Connect-ExchangeOnline –CertificateThumbprint $connection.CertificateThumbprint –AppId $connection.ApplicationID –ShowBanner:$false –Organization $tenant

"Getting Mailboxes..."
$MBX = Get-Mailbox
$MBX | ft DisplayName, PrimarySMTPAddress

"Done"

Nun kann das Script gestartet werden. Wie man sieht hat es funktioniert

Zum Schluss muss das Script noch Publiziert werden.

Grüsse
Andres Bohren

posted @ Sunday, April 4, 2021 11:12 AM | Filed Under [ Azure ]

Exchange Online PowerShell V2 Authentication with App in AzureAD (Update)

Hallo zusammen,

Wie man sich mit einer Application in Azure AD für Exchange anmeldet, habe ich ja bereits letzten Sommer mal beschrieben:

Exchange Online PowerShell V2 and Modern Auth with Application in AzureAD (Step-by-step)
https://blog.icewolf.ch/archive/2020/07/12/exchange-online-powershell-v2-and-modern-auth-with-application-in.aspx

Nun hat sich etwas bei den API Berechtigungen verändert: Die Exchange (legacy) API ist nicht mehr im GUI verfügbar

App-only authentication for unattended scripts in the EXO V2 module
https://docs.microsoft.com/en-us/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps

Wie in der obenstehenden Dokumentation beschrieben, muss man nun im Manifest die Zeile

"requiredResourceAccess": []

durch das hier ersetzen

"requiredResourceAccess": [
   {
      "resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
      "resourceAccess": [
         {
            "id": "dc50a0fb-09a3-484d-be87-e023b12c6440",
            "type": "Role"
         }
      ]
   }
],

Durch das Anpassen des Manifests erscheint dann die API Permission "Exchange.ManageAsApp". Dort muss man nur noch die "Grant Admin consent" bestätigen.

Dann sieht es so aus.

Der Rest ist gleich geblieben wie hier dokumentiert:

Exchange Online PowerShell V2 and Modern Auth with Application in AzureAD (Step-by-step)
https://blog.icewolf.ch/archive/2020/07/12/exchange-online-powershell-v2-and-modern-auth-with-application-in.aspx

Grüsse
Andres Bohren

posted @ Sunday, April 4, 2021 10:08 AM | Filed Under [ Exchange ]

Powershell v7.1.3 released

Hallo zusammen,

Schon eine paar Wochen her, dass PowerShell 7.1.3 veröffentlicht wurde. Bin aber erst jetzt dazu gekommen, das zu bloggen.

Hier habe ich zusätzlich zum default "Enable Powershell remoting" aktiviert

Grüsse
Andres Bohren

posted @ Sunday, April 4, 2021 8:54 AM | Filed Under [ Powershell ]

Powered by:
Powered By Subtext Powered By ASP.NET