Inhaltsverzeichnis

Die Microsoft Implementierung eines Email Server.

# Welche Service laufen
Get-Service | Where-Object { $_.Name -like "MSExchange*" } | Select-Object Name, Status

# Welche Logs gibt es
Get-WinEvent -ListLog *Exchange* | Select-Object LogName

# Welche Logs sind registriert
wevtutil el | Select-String "MSExchange"

Transport Dienste

Siehe auch Sender based routing

Frontend Transport

Mailbox Transport

Edge Transport

Hub Transport (nur in älteren Versionen von Exchange, wie 2010)

Transportdienst (Mailbox-Transportdienst in neueren Versionen von Exchange, wie 2013, 2016 und 2019)

Postfach

In Microsoft Exchange gibt es zwei Arten von Mailboxen: reguläre Mailboxen und freigegebene Mailboxen (Shared Mailbox). Es gibt auch Postfächer für Resourcen (z.B Raum- und Gerätereservierungen).

Get-Mailbox -RecipientTypeDetails (UserMailbox|SharedMailbox|RoomMailbox|EquipmentMailbox)

Mailbox

Shared Mailbox (Freigegebene Mailbox)

Kalender

Es gibt mehrere Arten von Kalendern

Alle Kalender in Benutzerpostfächern.

Get-Mailbox -RecipientTypeDetails UserMailbox | ForEach-Object {
    Get-MailboxCalendarFolder -Identity "$($_.PrimarySmtpAddress):\Kalender" -ErrorAction SilentlyContinue
}

Kalender aus freigegebenen Postfächern

Get-Mailbox -RecipientTypeDetails SharedMailbox | ForEach-Object {
    Get-MailboxCalendarFolder -Identity "$($_.PrimarySmtpAddress):\Calendar" -ErrorAction SilentlyContinue
}

Kalender in Ressourcenpostfächern.

Get-Mailbox -RecipientTypeDetails RoomMailbox, EquipmentMailbox | ForEach-Object {
    Get-MailboxCalendarFolder -Identity "$($_.PrimarySmtpAddress):\Calendar" -ErrorAction SilentlyContinue
}

Öffentliche Ordner mit Kalenderfunktion

Get-PublicFolder -Recurse | Where-Object {$_.FolderClass -eq "IPF.Appointment"}

Datenbank

In Exchange Server beziehen sich „Datenbanken“ auf die Speicherstrukturen, die verwendet werden, um E-Mails, Kontakte, Kalenderereignisse und andere Postfachdaten zu speichern. Diese Datenbanken werden auf dem Exchange-Server gehostet und ermöglichen die effiziente Speicherung und Verwaltung von E-Mail-Daten für Benutzer und Organisationen. Exchange-Datenbanken verwenden oft das Extensible Storage Engine (ESE), um die Daten persistent zu speichern und die Integrität der Datenbanken sicherzustellen.

EDB Datenbank

Eine EDB-Datei (Exchange Database File) ist eine Datenbankdatei, die von Microsoft Exchange Server verwendet wird, um E-Mails, Kontakte, Kalenderereignisse und andere Postfachdaten zu speichern. Diese Dateien enthalten die gesamte Information eines Exchange-Datenbankspeichers, einschließlich der Postfachdaten mehrerer Benutzer.

Die EDB-Dateien sind ein integraler Bestandteil des Exchange-Datenbanksystems und werden von Exchange Server zum Speichern und Organisieren von Daten verwendet. Wenn ein Benutzer beispielsweise eine E-Mail sendet, wird diese in einer EDB-Datei gespeichert, bis sie von einem anderen Benutzer abgerufen wird.

Die EDB-Dateien sind normalerweise in einem proprietären Format gespeichert und können nicht direkt von anderen Anwendungen geöffnet oder bearbeitet werden. Exchange Server bietet jedoch Tools und Mechanismen zum Sichern, Wiederherstellen und Verwalten von EDB-Dateien, um die Integrität und Verfügbarkeit der Daten zu gewährleisten.

Backup

Für den Microsoft Exchange Server sollte man insbesondere die folgenden Datenbanken und Dateien sichern:

Database Availability Group (DAG)

Ein „DAG“ (Database Availability Group) ist eine Funktion in Exchange Server, die Hochverfügbarkeit und Ausfallsicherheit für Postfachdatenbanken bietet. Eine DAG besteht aus mehreren Exchange-Servern, die in einer Gruppe zusammengefasst sind. Jeder Server in der DAG enthält Kopien der Postfachdatenbanken, die automatisch synchronisiert werden, um sicherzustellen, dass Benutzerkonten im Falle eines Serverausfalls oder einer Wartung weiterhin auf ihre E-Mails zugreifen können.

# Erstellen einer neuen DAG
New-DatabaseAvailabilityGroup -Name DAG1 -WitnessServer FILESERVER -WitnessDirectory C:\DAGWitness

# Hinzufügen von Servern zur DAG
Add-DatabaseAvailabilityGroupServer -Identity DAG1 -MailboxServer EXCHSRV1
Add-DatabaseAvailabilityGroupServer -Identity DAG1 -MailboxServer EXCHSRV2

# Erstellen einer neuen Datenbankkopie
Add-MailboxDatabaseCopy -Identity "MailboxDatabase01" -MailboxServer EXCHSRV2 -ActivationPreference 2

# Überprüfen des Status der DAG und Datenbankkopien
Get-DatabaseAvailabilityGroup -Identity DAG1
Get-MailboxDatabaseCopyStatus -Identity "MailboxDatabase01"

Exchange Server 2016 DAG - Database Availability Group Management

Cloud Migration

Es gibt verschiedene Möglichkeiten eine lokale Exchange Umgebung in die Azure Cloud zu migrieren.

Cutover

Exchange Server 2003, 2007, 2010, 2013. Gedacht für Migration von max. 2000 Postfächern. Es werden alle Postfächer in einem Batch migriert (Empfehlung bis 150). Nach der Migration gibt es keine lokalen Entitäten mehr, nur noch Cloud Identitäten. Umstellung des Nachrichtenfluss auf Exchange Online im Wartungsfenster. Hybrider Nachrichtenfluss ist nicht möglich.

Staged

Exchange Server 2003, 2007. Ermöglicht die Migration ausgewählter Postfächer. Diese werden mit AD Connect in das AzureAD synchronisiert. Lokale Postfach Benutzer werden zu Email Benutzern in Exchange Online. Migration erfolgt in Batches. AD Connect übernimmt die Weiterleitung eingehender lokaler Mails an migrierte Benutzer in Exchange Online. Ein hybrider Nachrichtenfluss zwischen dem lokalen Exchange Server und Exchange Online ist nicht möglich!

Hybrid

Exchange Server 2010, 2013, 2016, 2019. Migration ausgewählter Exchange Objekte zu Exchange Online. Postfächer können nach Bedarf zwischen den Umgebungen verschoben werden. Die Synchronisation der Objekte erfolgt mit AD Connect. Ermöglicht den parallelen Betrieb beider Umgebungen. Konfiguration mit dem Hybrid Configuration Wizard (HCW). Weiterleitung von eingehenden Nachrichten sowohl OnPremise als auch Exchange Online. Benötigt direkte SMTP Verbindung (Anforderungen an Firewall und Netzwerk).Verwaltung der Exchange Objekte in der lokalen Exchange Organisation.

Code

Email

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<Exchange-Server>/PowerShell/ -Authentication Kerberos
Import-PSSession $ExchangeSession -DisableNameChecking
 
Get-Mailbox
Get-Mailbox -Identity <Postfachname>
 
New-Mailbox -UserPrincipalName <UPN> -Alias <Alias> -Name <Name> -FirstName <Vorname> -LastName <Nachname> -Database <Datenbankname>
 
Remove-Mailbox -Identity <Postfachname>
 
Get-MailboxStatistics -Identity <Postfachname> | Select-Object DisplayName, TotalItemSize

AutoResponder

// Ohne Ende
Set-MailboxAutoReplyConfiguration -Identity "user@domain.local" -AutoReplyState Enabled -InternalMessage "Ihre Nachricht für interne Mails." -ExternalMessage "Ihre Nachricht für externe Mails."
 
// Mit Start und Enddatum
Set-MailboxAutoReplyConfiguration -Identity "user@domain.local" -AutoReplyState Scheduled -InternalMessage "Ihre Nachricht für interne Mails." -ExternalMessage "Ihre Nachricht für externe Mails." -StartDate "01/01/2022 00:00" -EndTime "01/01/2023 00:00"
 
// Deaktivieren
Set-MailboxAutoReplyConfiguration -Identity "user@domain.local" -AutoReplyState Disabled

Adressbuch

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<Exchange-Server>/PowerShell/ -Authentication Kerberos
Import-PSSession $ExchangeSession -DisableNameChecking
 
Get-AddressList
 
Get-AddressList -Identity "<Adressbuchname>"
 
New-AddressList -Name "<Name>" -RecipientFilter "<Filter>"
 
Set-AddressList -Identity "<Adressbuchname>" -RecipientFilter "<Filter>"
 
Remove-AddressList -Identity "<Adressbuchname>"

See here

[PS] C:\Windows\system32>Get-AddressList
 
Name                      DisplayName               RecipientFilter
----                      -----------               ---------------
All Contacts              All Contacts              RecipientType -eq 'MailContact'
All Distribution Lists    All Distribution Lists    ((Alias -ne $null) -and (ObjectCategory -like 'group'))
All Groups                All Groups                ((RecipientType -eq 'MailUniversalDistributionGroup') -or (RecipientType -eq 'MailUniversalSecurityGroup') -or (RecipientType
                                                    -eq 'MailNonUniversalGroup') -or (RecipientType -eq 'DynamicDistributionGroup'))
All Users                 All Users                 RecipientType -eq 'UserMailbox'
Öffentliche Ordner        Öffentliche Ordner        ObjectClass -eq 'publicFolder'
Public Folders            Public Folders            ((Alias -ne $null) -and (ObjectCategory -like 'publicFolder'))
All Rooms                 All Rooms                 ((RecipientType -eq 'UserMailbox') -and (ResourceMetaData -like 'ResourceType:*') -and (ResourceSearchProperties -ne $null))
 
[PS] C:\Windows\system32>Get-GlobalAddressList
 
Name                        RecipientFilter
----                        ---------------
Globale Standardadressliste ((Alias -ne $null) -and (((((((((((ObjectClass -eq 'user') -or (ObjectClass -eq 'contact'))) -or (ObjectClass -eq 'msExchSystemMailbox'))) -or
                            (ObjectClass -eq 'msExchDynamicDistributionList'))) -or (ObjectClass -eq 'group'))) -or (ObjectClass -eq 'publicFolder'))))
 
[PS] C:\Windows\system32>Get-OfflineAddressBook
 
Name                                 Versions   AddressLists
----                                 --------   ------------
Standard-Offlineadressliste (Ex2013) {Version4} {\Globale Standardadressliste}
 
[PS] C:\Windows\system32>Get-OfflineAddressBook "Standard-Offlineadressliste (Ex2013)" | Format-List Name, AddressLists
 
 
Name         : Standard-Offlineadressliste (Ex2013)
AddressLists : {\Globale Standardadressliste}
 
[PS] C:\Windows\system32>Set-OfflineAddressBook -Identity "Standard-Offlineadressliste (Ex2013)" -AddressLists "Globale Standardadressliste", "TestContactList"
 
[PS] C:\Windows\system32>Update-OfflineAddressBook -Identity "Standard-Offlineadressliste (Ex2013)"
 
[PS] C:\Windows\system32>Get-OfflineAddressBook "Standard-Offlineadressliste (Ex2013)" | Format-List Name, AddressLists
 
 
Name         : Standard-Offlineadressliste (Ex2013)
AddressLists : {\TestContactList, \Globale Standardadressliste}
 
[PS] C:\Windows\system32>

Kalender

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<Exchange-Server>/PowerShell/ -Authentication Kerberos
Import-PSSession $ExchangeSession -DisableNameChecking
 
Get-MailboxFolderStatistics -Identity <Benutzername> -FolderScope Calendar | Select-Object Name, ItemsInFolder, FolderSize
 
New-MailboxAppointment -Mailbox <Benutzername> -Subject "<Betreff>" -Location "<Ort>" -Start "<Startzeit>" -End "<Endzeit>"
 
Set-MailboxCalendarItem -Identity <TerminID> -Subject "<Neuer Betreff>" -Location "<Neuer Ort>" -Start "<Neue Startzeit>" -End "<Neue Endzeit>"
 
Remove-MailboxCalendarItem -Identity <TerminID>
 
 
Get-MailboxFolderPermission -Identity user@domain.local:\Calendar
Add-MailboxFolderPermission -Identity user@domain.local:\Calendar -User otheruser@domain.local -AccessRights <Zugriffsrechte>
Set-MailboxFolderPermission -Identity user@domain.local:\Calendar -User otheruser@domain.local -AccessRights <Zugriffsrechte>
Remove-MailboxFolderPermission -Identity user@domain.local:\Calendar -User otheruser@domain.local

Troubleshooting

Kalender

// berechtigungen
Get-MailboxFolderPermission -Identity "<Postfach>:\Kalender"
 
// synchronisierung
Get-CalendarProcessing -Identity "<Postfach>"
 
// eventlog
Get-EventLog -LogName Application -Source "MSExchange*"
 
//timezone
Get-MailboxRegionalConfiguration -Identity <Postfach>
Get-Mailbox -Database <Datenbankname> | Get-MailboxRegionalConfiguration
Set-MailboxRegionalConfiguration -Identity <Benutzer> -TimeZone <Zeitzone>

Mailqueue

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<Exchange-Server>/PowerShell/ -Authentication Kerberos
Import-PSSession $ExchangeSession -DisableNameChecking
 
Get-Queue
Get-Queue -Identity <Warteschlangenname>

MessageTrace

Get-MessageTrackingLog -Sender "<Absender>" -Recipients "<Empfänger>" -MessageSubject "<Betreff>"
Get-MessageTrackingLog -EventID "FAIL" -Start "<Startdatum>" -End "<Enddatum>"
Get-Content -Path "C:\Exchange\TransportRoles\Logs\ProtocolLog\SmtpReceive\<Protokolldatei>"
Get-TransportServer | Select-Object -Property Name, TotalRetryQueueLength, TotalSubmissionQueueLength

Logs

Aufgaben kann man mit Powershell automatisieren.

Downloads

ActiveSync

Exchange Active Sync (ActiveSync) ist ein von Microsoft entwickeltes Protokoll zur Synchronisierung von E-Mails, Kontakten, Kalendern und Aufgaben zwischen einem E-Mail-Server und mobilen Geräten wie Smartphones und Tablets. Es ermöglicht eine nahtlose Integration von E-Mail-Diensten, Kalendern und Kontakten auf verschiedenen Geräten und Plattformen.

# Finde alle Exchange Active Sync Geräte
PS C:\> Get-MobileDevice
 
RunspaceId              : ecfdbf6d-b44a-4369-aeed-4cb29e286eb0
FriendlyName            :
DeviceId                : sophfw5x48gu9ryw66f5tnmu9nlg8ip4
DeviceImei              :
DeviceMobileOperator    :
DeviceOS                :
DeviceOSLanguage        :
DeviceTelephoneNumber   :
DeviceType              : iPhone5sGlobal
DeviceUserAgent         : SecurePIM 7.23.4 - iOS 10.2.1
DeviceModel             : iPhone5sGlobal
FirstSyncTime           : 21.02.2017 15:57:40
UserDisplayName         : dom.local/USERS/User1
DeviceAccessState       : Allowed
DeviceAccessStateReason : Global
DeviceAccessControlRule :
ClientVersion           : 14.1
ClientType              : EAS
IsManaged               : False
IsCompliant             : False
IsDisabled              : False
AdminDisplayName        :
ExchangeVersion         : 0.10 (14.0.100.0)
Name                    : iPhone5sGlobal§sophfw5x48gu9ryw66f5tnmu9nlg8ip4
DistinguishedName       : CN=iPhone5sGlobal§sophfw5x48gu9ryw66f5tnmu9nlg8ip4,CN=ExchangeActiveSyncDevices,CN=User1,OU=USERS,DC=dom,DC=local
Identity                : dom.local/Users/User1/ExchangeActiveSyncDevices/iPhone5sGlobal§sophfw5x48gu9ryw66f5tnmu9nlg8ip4
Guid                    : 044e412d-c004-4530-9ed9-19eb70a3ef91
ObjectCategory          : dom.local/Configuration/Schema/ms-Exch-Active-Sync-Device
ObjectClass             : {top, msExchActiveSyncDevice}
WhenChanged             : 06.05.2024 12:20:17
WhenCreated             : 21.02.2017 16:57:40
WhenChangedUTC          : 06.05.2024 10:20:17
WhenCreatedUTC          : 21.02.2017 15:57:40
OrganizationId          :
Id                      : dom.local/Users/User1/ExchangeActiveSyncDevices/iPhone5sGlobal§sophfw5x48gu9ryw66f5tnmu9nlg8ip4
OriginatingServer       : vie-srv-dc02.dom.local
IsValid                 : True
ObjectState             : Unchanged
$all_devices = Get-MobileDevice
Get-MobileDeviceStatistics -Identity $all_devices[0].Guid.toString()
[PS] C:\> Get-Mailbox -ResultSize Unlimited | Get-CasMailbox | Where-Object { $_.ActiveSyncEnabled -eq $true } 

Public Folder

# alle public folder
Get-PublicFolder -Recurse -ResultSize Unlimited
 
# Nur Top-Level
Get-PublicFolder -ResultSize Unlimited -Recurse | select Name,ParentPath | where-object { $_.ParentPath -eq "\" }
 
Add-PublicFolderClientPermission -Identity \My-Folder -User test.user -AccessRights Editor|Owner|Publisher
Get-PublicFolderClientPermission -Identity \My-Folder
Remove-PublicFolderClientPermission -Identity \My-Folder -User test.user
RunspaceId                     : f6622ea7-e6d2-4528-97b1-036c9298cf3d
Identity                       : \
Name                           : IPM_SUBTREE
MailEnabled                    : False
MailRecipientGuid              :
ParentPath                     :
LostAndFoundFolderOriginalPath :
ContentMailboxName             : PFMailbox1
ContentMailboxGuid             : 442dc65a-3bbc-471e-afcd-b0244b273847
EformsLocaleId                 :
PerUserReadStateEnabled        : True
EntryId                        : 000000001A447390AA6611CD9BC800AA002FC45A0300047699F147FA0A4B891FFFB0825125790000000000020000
DumpsterEntryId                : 000000001A447390AA6611CD9BC800AA002FC45A0300FF1CBA839DBE6F42B05F589E5BA643340000000000020000
ParentFolder                   : 000000001A447390AA6611CD9BC800AA002FC45A0300047699F147FA0A4B891FFFB0825125790000000000010000
OrganizationId                 :
AgeLimit                       :
RetainDeletedItemsFor          :
ProhibitPostQuota              : Unlimited
IssueWarningQuota              : Unlimited
MaxItemSize                    : Unlimited
LastMovedTime                  :
AdminFolderFlags               :
FolderSize                     : 0
HasSubfolders                  : True
FolderClass                    :
FolderPath                     : {}
AssociatedDumpsterFolders      :
DefaultFolderType              : None
ExtendedFolderFlags            : SharedViaExchange
MailboxOwnerId                 : domain.local/Users/PFMailbox1
IsValid                        : True
ObjectState                    : Unchanged

bzw.

RunspaceId                     : f6622ea7-e6d2-4528-97b1-036c9298cf3d
Identity                       : \DUMMY-Newsletter
Name                           : DUMMY-Newsletter
MailEnabled                    : True
MailRecipientGuid              : 2956ec64-1f20-4ee6-a5f2-dbeb2c10b5b1
ParentPath                     : \
LostAndFoundFolderOriginalPath :
ContentMailboxName             : PFMailbox2
ContentMailboxGuid             : 70c4457e-a502-4170-bf73-fcb4f17cce2c
EformsLocaleId                 :
PerUserReadStateEnabled        : True
EntryId                        : 000000001A447390AA6611CD9BC800AA002FC45A0300822DFDE48134CA4A9BB7E1548BC7FBD90000000559DC0000
DumpsterEntryId                : 000000001A447390AA6611CD9BC800AA002FC45A0300FF1CBA839DBE6F42B05F589E5BA643340000000000100000
ParentFolder                   : 000000001A447390AA6611CD9BC800AA002FC45A0300047699F147FA0A4B891FFFB0825125790000000000020000
OrganizationId                 :
AgeLimit                       :
RetainDeletedItemsFor          :
ProhibitPostQuota              : Unlimited
IssueWarningQuota              : Unlimited
MaxItemSize                    : Unlimited
LastMovedTime                  : 06.10.2023 13:55:05
AdminFolderFlags               :
FolderSize                     : 0
HasSubfolders                  : False
FolderClass                    : IPF.Note
FolderPath                     : {DUMMY-Newsletter}
AssociatedDumpsterFolders      :
DefaultFolderType              : None
ExtendedFolderFlags            : SharedViaExchange, SharedExchangeEver, SharedExchangeWrite, SharedExchangeWriteEver, SharedExchangeValid
MailboxOwnerId                 : d2000.local/Users/PFMailbox1
IsValid                        : True
ObjectState                    : Unchanged

Test Script

# EWS Config
$MailboxForAutodiscover = "manuel.zarat@akm.at"   # nur für Autodiscover
$UseDefaultCredentials  = $false                    # Wenn als Mailbox in Windows angemeldet
$EwsCred = Get-Credential                        # wenn keine DefaultCreds
 
function Get-PublicFolderFolderClassEws {
    param([Parameter(Mandatory)][string]$PfPath)
 
    # DLL laden (Standardpfad; Versionsabhängig?)
    $dll = "$env:ProgramFiles\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
    if (-not ("Microsoft.Exchange.WebServices.Data.ExchangeService" -as [type])) {
        if (-not (Test-Path $dll)) { return $null }
        Add-Type -Path $dll
    }
 
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService(
        [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1
    )
 
    if ($UseDefaultCredentials) {
        $service.UseDefaultCredentials = $true
    } else {
        $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials(
            $EwsCred.UserName, $EwsCred.GetNetworkCredential().Password
        )
    }
 
    $service.AutodiscoverUrl($MailboxForAutodiscover, { $true })
 
    $current = [Microsoft.Exchange.WebServices.Data.Folder]::Bind(
        $service, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::PublicFoldersRoot
    )
 
    foreach ($seg in $PfPath.Trim("\").Split("\") | Where-Object { $_ }) {
        $view   = New-Object Microsoft.Exchange.WebServices.Data.FolderView(100)
        $filter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo(
            [Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName, $seg
        )
        $res = $service.FindFolders($current.Id, $filter, $view)
        if ($res.TotalCount -lt 1) { return $null }
        $current = $res.Folders[0]
    }
 
    return $current.FolderClass
}
 
function Show-Subs {
    param(
        [Parameter(Mandatory)] $ParentEntryId,
        [int] $Level = 1
    )
 
    $subs = Get-PublicFolder -ResultSize Unlimited -Recurse | Where-Object { $_.ParentFolder -eq $ParentEntryId }
 
    foreach ($sub in $subs) {
 
        $perms = Get-PublicFolderClientPermission -Identity $sub.Identity -ErrorAction SilentlyContinue
        $owners = $perms | Where-Object { $_.AccessRights -contains "Owner" } | Select-Object -ExpandProperty User -ErrorAction SilentlyContinue
        if (-not $owners) { $owners = "<none>" }
        $permString = ($perms | ForEach-Object { "$($_.User):$($_.AccessRights -join ',')" }) -join '; '
 
        #Write-Host ("{0}{1} => [E]{2} => [P]{3}" -f ("`t" * $Level), $sub.Name, $sub.EntryId, $sub.ParentFolder)
        Write-Host ("{0}{1}" -f ("`t" * $Level), $sub.Name)
        Write-Host ("{0}- EntryId: {1}" -f ("`t" * $Level), $sub.EntryId)
        Write-Host ("{0}- ParentFolder: {1}" -f ("`t" * $Level), $sub.ParentFolder)
 
        Write-Host ("{0}- Owner(s): {1}" -f ("`t" * ($Level + 1)), ($owners -join ', '))
        Write-Host ("{0}- Permissions: {1}" -f ("`t" * ($Level + 1)), $permString)
 
		$addr = Get-MailPublicFolder -Identity $sub.Identity -ErrorAction SilentlyContinue
		if ($addr -and $addr.PrimarySmtpAddress) {
			Write-Host ("{0}- Address: {1}" -f ("`t" * ($Level + 1)), $addr.PrimarySmtpAddress)
		} else {
			Write-Host ("{0}- Address: ---" -f ("`t" * ($Level + 1)))
		}
 
		$type = Get-PublicFolderFolderClassEws -PfPath $sub.Identity
		if (-not $type) { $type = "<unknown>" }
		Write-Host ("{0}- Type: {1}" -f ("`t" * ($Level + 1)), $type)
 
        Show-Subs -ParentEntryId $sub.EntryId -Level ($Level + 1)
 
    }
}
 
Get-PublicFolder -ResultSize Unlimited -Recurse | Where-Object { $_.ParentPath -eq "\" } | Select-Object Name, EntryId, ParentFolder, Identity | ForEach-Object {
 
	$curr = $_
 
	$perms = Get-PublicFolderClientPermission -Identity $curr.Identity -ErrorAction SilentlyContinue
    $owners = $perms | Where-Object { $_.AccessRights -contains "Owner" } | Select-Object -ExpandProperty User -ErrorAction SilentlyContinue
    if (-not $owners) { $owners = "<none>" }
    $permString = ($perms | ForEach-Object { "$($_.User):$($_.AccessRights -join ',')" }) -join '; '
 
    #Write-Host "$($curr.Name) => [E]$($curr.EntryId) => [P]$($curr.ParentFolder)"
    Write-Host "$($curr.Name)"
    Write-Host "`t- EntryId: $($curr.EntryId)"
    Write-Host "`t- ParentFolder: $($curr.ParentFolder)"
    Write-Host ("`t- Owner(s): {0}" -f ($owners -join ', '))
    Write-Host ("`t- Permissions: {0}" -f $permString)
 
	try {
		$addr = Get-MailPublicFolder -Identity $curr.Identity -ErrorAction SilentlyContinue
		if ($addr -and $addr.PrimarySmtpAddress) {
			Write-Host ("`t- Address: {0}" -f ($addr.PrimarySmtpAddress))
		} else {
			Write-Host ("`t- Address: ---")
		}
	} catch {}
 
	$type = Get-PublicFolderFolderClassEws -PfPath $curr.Identity
	if (-not $type) { $type = "<unknown>" }
	Write-Host ("`t- Type: {0}" -f $type)
 
    Show-Subs -ParentEntryId $curr.EntryId -Level 1
 
}

Mail enabled

# nur mailaktivierte öffentliche Ordner
Get-MailPublicFolder -ResultSize unlimited
RunspaceId                             : f6622ea7-e6d2-4528-97b1-036c9298cf3d
Contacts                               : {}
ContentMailbox                         :
DeliverToMailboxAndForward             : False
ExternalEmailAddress                   : expf:EVENTCONFIG_NOTES1D8919E34D8919E34D8919E34499209C7000011
EntryId                                :
OnPremisesObjectId                     :
IgnoreMissingFolderLink                : False
ForwardingAddress                      :
PhoneticDisplayName                    :
AcceptMessagesOnlyFrom                 : {}
AcceptMessagesOnlyFromDLMembers        : {}
AcceptMessagesOnlyFromSendersOrMembers : {}
AddressListMembership                  : {}
AdministrativeUnits                    : {}
Alias                                  : EventConfig_NOTES1
ArbitrationMailbox                     :
BypassModerationFromSendersOrMembers   : {}
OrganizationalUnit                     : d2000.local/Microsoft Exchange System Objects
CustomAttribute1                       :
CustomAttribute10                      :
CustomAttribute11                      :
CustomAttribute12                      :
CustomAttribute13                      :
CustomAttribute14                      :
CustomAttribute15                      :
CustomAttribute2                       :
CustomAttribute3                       :
CustomAttribute4                       :
CustomAttribute5                       :
CustomAttribute6                       :
CustomAttribute7                       :
CustomAttribute8                       :
CustomAttribute9                       :
ExtensionCustomAttribute1              : {}
ExtensionCustomAttribute2              : {}
ExtensionCustomAttribute3              : {}
ExtensionCustomAttribute4              : {}
ExtensionCustomAttribute5              : {}
DisplayName                            : EventConfig_NOTES1
EmailAddresses                         : {smtp:EventConfig_NOTES1@domain.co.at, SMTP:EventConfig_NOTES1@domain.at, X400:C=AT;A=
                                         ;P=DUMMY;O=D003A2;S=EventConfig?NOTES1;, FAXMAKER:EventConfig_AKMNOTES1@D003A2.DUMMY.com}
GrantSendOnBehalfTo                    : {}
ExternalDirectoryObjectId              :
HiddenFromAddressListsEnabled          : True
LastExchangeChangedTime                :
LegacyExchangeDN                       : /o=DUMMY1/ou=D003A2/cn=Recipients/cn=EVENTCONFIG_NOTES1D8919E34D8919E34D8919E34499209C7000011
MaxSendSize                            : Unlimited
MaxReceiveSize                         : Unlimited
ModeratedBy                            : {}
ModerationEnabled                      : False
PoliciesIncluded                       : {87675609-8fa3-4aaf-af06-68bb88d36b4e, {26491cfc-9e50-4857-861b-0cb8df22b5d7}}
PoliciesExcluded                       : {}
EmailAddressPolicyEnabled              : True
PrimarySmtpAddress                     : EventConfig_NOTES1@domain.at
RecipientType                          : PublicFolder
RecipientTypeDetails                   : PublicFolder
RejectMessagesFrom                     : {}
RejectMessagesFromDLMembers            : {}
RejectMessagesFromSendersOrMembers     : {}
RequireSenderAuthenticationEnabled     : False
SimpleDisplayName                      :
SendModerationNotifications            : Always
UMDtmfMap                              : {}
WindowsEmailAddress                    : EventConfig_NOTES1@domain.at
MailTip                                :
MailTipTranslations                    : {}
Identity                               : d2000.local/Microsoft Exchange System Objects/EventConfig_NOTES1
IsValid                                : True
ExchangeVersion                        : 0.0 (6.5.6500.0)
Name                                   : EventConfig_NOTES1
DistinguishedName                      : CN=EventConfig_NOTES1,CN=Microsoft Exchange System Objects,DC=d2000,DC=local
Guid                                   : 3845b437-d154-47ac-b6bf-f3f0b5dedb4b
ObjectCategory                         : d2000.local/Configuration/Schema/ms-Exch-Public-Folder
ObjectClass                            : {top, publicFolder}
WhenChanged                            : 06.05.2024 12:20:17
WhenCreated                            : 21.05.2002 13:06:02
WhenChangedUTC                         : 06.05.2024 10:20:17
WhenCreatedUTC                         : 21.05.2002 11:06:02
OrganizationId                         :
Id                                     : d2000.local/Microsoft Exchange System Objects/EventConfig_NOTES1
OriginatingServer                      : dc02.d2000.local
ObjectState                            : Changed