blog.icewolf.ch

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

My Links

Archives

Post Categories

icewolf

Tuesday, March 24, 2020

EWS Managed API: Export Attachments from specific Folder

Hallo zusammen,

Ich hatte schon lange vor, diesen Blog Artikel zu schreiben. Nun ist mir der Codeschnipsel wieder in die Hände gekommen und ich habe beschlossen, das endlich zu veröffentlichen.

Ich hatte einen Fall, bei dem ich die  *.jpg Attachments von Mails aus einem bestimmten Ordner exportieren wollte.

Für das Script nutze ich PowerShell und das EWS Managed API

Microsoft Exchange Web Services Managed API 2.2

https://www.microsoft.com/en-us/download/details.aspx?id=42951

 

Ausserdem wird die Exchange ApplicationImpersonation Rolle genutzt.

 

Diese Rolle muss man in Exchange Online erst einrichten.

 

Ich habe dazu eine Custom Role erstellt: Icewolf-Impersonation

 

Scope: Auf welche Objekte kann man zugreifen. Das kann mit einem ManagementScope eingeschränkt werden.

Rolle: Welche Rechte beinhaltet die Rolle

Mitglieder: Wer kann das Tun (User oder Gruppe)

 

Nach dem Anlegen der Rolle bekam ich eine Alert Benachrichtigung von Office 365

Der Grund liegt in den "Alert policies" im Office 365 Security and Compliance center. Dort gibt es einen entsprechenden Alarm. Finde ich gut - so etwas gibt es OnPrem nicht - jedenfalls nicht von Hause aus.

Hier nun der PowerShell Code

# Global Vars
[string]$EwsApiDll = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
[string]$Email = "ewservice@icewolf.ch"
[string]$Username = "ewservice@icewolf.ch"
[string]$Password = "MySecretPassword"
[string]$Domain = "Corp"
[string]$EWSURL = ""
[string]$EWSURL = "https://outlook.office365.com/EWS/Exchange.asmx"
[string]$ImpersonationMailbox = "a.bohren@icewolf.ch"

Import-Module -Name $EwsApiDll
Write-Host ("Imported EWS Module")

$EWService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
$EWService.Credentials = new-object Microsoft.Exchange.WebServices.Data.WebCredentials($Username,$Password,$Domain)

If ($EWSURL -eq "")
{
 $EWService.AutodiscoverUrl($Email)
 Write-Host ("Using Autodiscover")
} else {
 $EWService.Url = $EWSURL
 Write-Host ("Using EWS URL")
}

Write-Host ("-->Impersonation to Mailbox: " + $ImpoersonMailbox)
$EWService.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $ImpersonationMailbox)

###############################################################################
# Save Attachments from Deleted Items
###############################################################################
$offset = 0
do {
 $ItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000, $offset)   
 $ItemView.PropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
 $Items = $EWService.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::DeletedItems,$ItemView)               
 $Items | ft Subject

 foreach ($Item in $Items)
 {
  If ($Item.HasAttachments -eq $true)
  {
   #DEBUG
   Write-Host "Subject: $($Item.Subject)" -ForegroundColor cyan
  
   #Define PropertySet and GetMessage
   $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.ItemSchema]::Attachments)
   $Message = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($ewservice,$Item.Id,$psPropertySet)   
  
   Foreach ($Attachment in $Message.Attachments)
   {
    $AttachmentName = $Attachment.Name
    #Write-Host "FileName: $AttachmentName"
    If ($AttachmentName -match ".jpg")
    {
     $AttachmentName
     Write-Host "FileName: $AttachmentName" -ForegroundColor green
     
     #SaveAttachment
     $Attachment.Load("C:\Temp\Spam\$AttachmentName")
    }
   }
  }
 }
 $offset = $offset + 1000
} while($Items.MoreAvailable)

Uns so sieht dann das Resultat aus. 

Hoffe diese Codeschnipsel sind auch jemandem andern nützlich.

Liebe Grüsse
Andres Bohren

posted @ Wednesday, March 25, 2020 9:27 PM | Filed Under [ Exchange Powershell ]

Citrix Workspace App for Windows 2002

Hallo zusammen,

Seit heute gibt es eine die neue Version 2002 der Citrix Workspace App für Windows.

Liebe Grüsse
Andres Bohren

posted @ Tuesday, March 24, 2020 11:25 PM | Filed Under [ Citrix ]

Migrate VM from ESX to Azure - Part 3

Hallo zusammen,

In den vorangegangenen Blog Artikeln habe ich erklärt, wie man eine VM von ESX nach Azure migriert.

Nun gibt es noch ein paar Settings, welche gemacht werden müssen, damit man sich auf die VM's verbinden kann. Denn die laufen ja in einem VNET mit einer Privaten IP Adresse.

Eine Möglichkeit wäre den VPN Gateway zu benutzen oder man könnte Azure Bastion verwenden. Und vermutlich gibt es noch einige andere Möglichkeiten.

Ich habe mich jedoch für einen anderen Weg entschieden. Ich erstelle für jeden Server eine dynamische Public IP und gebe der einen öffentlichen DNS Namen.

Das Public IP Objekt muss dann mit einem Netzwerkadapter verbunden (associate) werden.

Anschliessend erstelle ich eine Network Security Group (NSG) und  erstelle dort eine Incoming Rule für RDP (TCP 3389).

Die NSG verbinde ich mit allen Netzwerkadaptern.

In Azure laufen ein paar Dinge grundlegend anders, als man das von einer OnPrem Infrastruktur gewohnt ist. Die IP ändert man nicht in einer VM unter den Netzwerkeinstellungen. Sondern man stellt das im Azure Netzwerk Interface Objekt um.

Ich konfiguriere für jede VM eine statische IP Adresse.

Auch die DNS Einstellungen macht man auf dem Netzwerk Interface des Azure Objekts

Mit der Cloud Shell kann man die VM's in einer Resource Group anzeigen lassen. Mit dem Parameter "-Status" wird auch noch angezeigt, ob die VM's laufen.

Get-AzureRmVM -ResourceGroupName LAB -Status

Und mit folgendem Befehl, kann man eine VM Starten

Start-AzureRmVM -ResourceGroupName LAB -Name LAB04

Dauert natürlich eine Weile, bis die VM's up and running sind, aber danach kann man sich per RDP auf die Server verbinden.

Grüsse
Andres Bohren

posted @ Tuesday, March 24, 2020 10:38 PM | Filed Under [ Virtualisation Azure ]

Powered by:
Powered By Subtext Powered By ASP.NET