Microsoft Exchange spezifische Powershell cmdlets.

Standardverzeichnis für Echange 2010 Scripts:
C:\Program Files\Microsoft\Exchange Server\V14\Scripts

Weitere wichtige Scripte:
Get-DAGHealth.ps1
Test-ExchangeServerHealth.ps1

Auswertung gesendeter Mails von einem Postfach

Get-MessageTrackingLog -ResultSize Unlimited -EventId "Send" -Sender "sender@domain.de" | Select-Object Timestamp,ServerHostname,ClientHostname,Source,EventId,@{
e={[string]::join(';', ($_.Recipients))};l='Recipients'} | export-csv -notypeinformation -encoding UTF8 -delimiter ";" Auswertung.csv

Exchange Version abfragen

Get-ExchangeServer | select Name, AdminDisplayVersion

OWA aktivieren/deaktivieren

Set-CasMailbox -Identity "Benutzername" -OWAEnabled $false

Benutzer auflisten, die auf ein gegebenes Benutzerpostfach Vollzugriff haben

Get-MailboxPermission [username]| ? {$_.AccessRights -match "FullAccess" -and $_.IsInherited -eq $False} | where { ($_.user.tostring() -ne "NT-AUTORITÄT\SELBST") } | select User

Benutzerpostfächer auflisten, auf die ein gegebener Benutzer Vollzugriff hat

$Postfächerp = Get-Mailbox -ResultSize Unlimited | Get-MailboxPermission | Where-Object { $_.User.RawIdentity -eq "domain\user" }

Get-Mailbox -Resultsize Unlimited | Get-MailboxPermission -User [Benutzername]| ? {$_.AccessRights -match "FullAccess" -and $_.IsInherited -eq $False} | Select Identity

Prüfen ob eine E-Mail-Adresse bereits vergeben ist

Get-Recipient -resultSize unlimited | select name -expand emailAddresses | where {$_.smtpAddress -eq "adr@domain.com"} | Format-Table name, smtpaddress

Abwesenheitsnotiz setzen

Get-MailboxAutoReplyConfiguration
 
Set-MailboxAutoReplyConfiguration -Identity  -AutoReplyState Enabled|Disabled|Scheduled
Set-MailboxAutoReplyConfiguration -Identity  –AutoReplyStateScheduled –StartTime 01.01.2012 –StopTime 02.01.2012

Postfachgröße ermitteln

Get-MailboxStatistics -identity  | sort $_.TotalItemSize | FT DisplayName,TotalItemSize
Get-MailboxStatistics -server  | sort $_.TotalItemSize | FT DisplayName,TotalItemSize

Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | Select-Object DisplayName,TotalItemSize -First 3

Freien Whitespace ermitteln

Exchange 2010 kann seine Datenbanken nicht verkleinern, wenn Mailboxen verschoben werden. Stattdessen wird der frei gewordene Bereich markiert. Das nennt man in diesem Kontext Whitespace. Die Größe des vorhandenen Whitespaces pro Datenbank gibt man mit folgendem Befehl aus:

Get-MailboxDatabase -status | Select-Object Server,Name,AvailableNewMailboxSpace | sort AvailableNewMailboxSpace -desc

Get-MailboxDatabase -status | Sort-Object AvailableNewMailboxSpace| ft Name,DatabaseSize,AvailableNewMailboxSpace

Kopiert man nun eine Mailbox in einer Datenbank , deren Whitespace größer ist, als die Mailboxgröße, sollte die Datenbankgröße nicht anwachsen. ACHTUNG: Es werden dabei aber Transaction Logs geschrieben. Diese werden dann mit dem nächsten Backup entfernt.

Mailbox Suchindex aktualisieren

Wird Outlook im cached Modus betrieben ist der Windows Suchdienst für die Indexierung verantworlich (muss bei älteren Serverversionen als Rolle installiert werden). Im Online Modus wird die Suchanfrage an Exchange wieter gegeben. Gibt es in diesem Fall Probleme bei der Suche kann man den Index für die Mailbox neu erstellen.

New-MoveRequest benutzer@domain

Mit dem Befehl verschiebt man die Mailbox in eine andere Datenbank. Dabei wird der Suchindex neu erstellt. Das ist auch die offizielle Vorgehensweise bei Problemen mit der Indizierung. ACHTUNG: es werden eine Menge Transaction Logs geschrieben. Mindestens das Doppelte der Postfachgröße sollte auf der Datenbankpartition frei sein.

Wie weit die Aktion abgeschlossen ist kann man sehen mit dem Befehl

Get-MoveRequestStatistics benutzer@domain

Datenbank Cache aktualisieren

Get-MailboxDatabase | Clean-MailboxDatabase

Deaktivierte Konten anzeigen

Get-MailboxDatabase | Get-MailboxStatistics | Where{ $_.DisconnectDate -ne $null } |fl DisplayName, Database, Identity, DisconnectReason

Datenbank Größe

Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize | sort-object Databasesize

Datenbank Move History

(Get-MailboxStatistics -Identity -IncludeMoveHistory -IncludeMoveReport -Archive).MoveHistory

Datenbank Move Request (ArchiveOnly)

New-MoveRequest -Identity -ArchiveOnly -ArchiveTargetDatabase

Datenbank Move Request (Nur Benutzerpostfach)

New-MoveRequest -Identity -PrimaryOnly -TargetDatabase

Alle Benutzer mit aktiviertem Archivpostfach auflisten

Get-Mailbox | where {$_.ArchiveDatabase -ne $null}

Alle Benutzer mit aktiviertem Archivpostfach auflisten und Ausgabe formatieren

Get-Mailbox | where {$_.ArchiveDatabase -ne $null} | ft name, archivedatabase, archivename, archivequota, archivewarningquota -AutoSize

Datenbanken mit aktivierter Umlaufprotokollierung ermitteln

get-MailboxDatabase | where {$_CircularLoggingEnabled -eq $true}

Postfachgröße für Benutzerpostfach ermitteln

Get-MailboxStatistics | fl

Postfachgröße für Archivpostfach ermitteln

Get-MailboxStatistics -archive | fl

Exchange Fehler und Probleme

Test-ServiceHealth
Test-ReplicationHealth 
Test-Exchangesearch

Get-MailboxDatabaseCopyStatus 
Get-MailboxDatabaseCopyStatus –Server EX1 | fl Name,*Index* 

Zeigt an ob der ContextIndex Status OK ist. Wenn nicht, muss die Datenbank angehalten werden und Update-MailboxDatabaseCopy ausgeführt werden.

Get-MailboxDatabaseCopyStatus * | where {$_.ContentIndexState -eq "Failed"} | Update-MailboxDatabaseCopy -CatalogOnly

Bei Performanceproblemen die Benutzungsstatistik der Datenbanken ausgeben:

Get-StoreUsageStatistics -Database DBNAME | Sort-Object LogRecordBytes -desc | Select-Object -First 10 | ft DigestCategory, *guid, LogRecordBytes, *time* -auto

Die anzahl der Mailboxitems pro Postfach ausgeben. Darf bei Exchange 2010 nicht mehr als 100.000 betragen, bei Exchange 2007 nicht mehr als 50.000.

Get-Mailbox -database DBNAME | Get-MailboxStatistics | Sort-Object ItemCount -descending |Select-Object DisplayName,ItemCount,@{name="MailboxSize";exp={$_.totalitemsize}} -first 10 | Convertto-Html | out-File c:\temp\report.htm

Bei fehlerhaftem ContentIndex. Im Eventlog kann man den Status der Aktion ablesen. Die Event ID 109 des MSExchange Suchindizierungsdienstes zeigt den Start an, die Event ID 110 das Ende. Dauert pro Datenbank ca. 2 Minuten bei 80GB.

C:\Program Files\Microsoft\Exchange Server\V14\Scripts\ResetSearchIndex.ps1 -force dbname

Löscht den Catalog Index und startet ein erneutes Seeding. Der MS Exchange Suchdienst wird hierfür kurz angehalten.

Update-MailboxDatabaseCopy "Server\Database" -SourceServer "Name of the server whos copy was reset" -CatalogOnly

Um die Datenbankkopie, deren Index nicht neu erstellt wurde, mit der Kopie mit dem neuen Index zu synchronisieren. https://social.technet.microsoft.com/Forums/ie/en-US/b4c7879a-1867-41f1-80d7-11705ce9e111/questions-about-resetsearchindexps1?forum=exchange2010.

iisreset

Bei änderungen am Exchange muss der IIS manchmal resettet werden oder wenn die Management Console nicht startet.

MSExchange Common Event 106 (Custom counters file view is out of memory)
Due to BLOG entry http://social.technet.microsoft.com/Forums/en-US/exchange2010/thread/079598ef-08fe-49b6-af5f-8920d8b34a39 (thanx Brian) we checked the registry permissions of ‚HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\v14\Transport‘.
The permissions on this Regitry Key were incorrectly ordered! We don’t know the reason why.

1. Corrected the registry permissions of the mentioned Key to Administrators, SYSTEM, NETWORKSERVICE: full control
2. Reloaded the following performance counters using EMS and add-pssnapin Microsoft.Exchange.Management.PowerShell.Setup

new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\AdminAuditPerfCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ResourceHealthPerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ThrottlingPerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\MiddleTierStoragePerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\IsMemberOfResolverPerfCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ADRecipientCachePerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\RpcClientAccessPerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ExchangeTopologyPerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ExSearchPerformanceCounters.xml"
new-perfcounters –definitionfilename "C:\Program Files\Microsoft\Exchange Server\V14\Setup\Perf\ExSearchCatalogPerformanceCounters.xml"

Datenbank Cache aktualisieren

Get-MailboxDatabase | Clean-MailboxDatabase

Deaktivierte Konten anzeigen

Get-MailboxDatabase | Get-MailboxStatistics | Where{ $_.DisconnectDate -ne $null } |fl DisplayName, Database, Identity, DisconnectReason

legacyExchangeDN Anzeigen

Get-Mailbox <username> | Format-List Identity, legacyExchangeDN