Archiv der Kategorie: Exchange Server 2010

Exchange Server 2010 – Öffentliche Ordner – Zombie User entfernen

Wenn ein Benutzer vollständig gelöscht oder nur die Mailbox gelöscht wird, erscheint dieser als „NT User:xxxxxxxxxxxxxxxxxxxxxxxxxx“ in den Berechtigungen des Öffentliches Ordners. Diese Berechtigungen sind eigentlich nicht per Exchange Console oder Powershell entfernbar und verbleiben an dem Ordner. Mit ExFolders kann man diese händisch löschen, was aber sehr viel manueller Aufwand bedeutet. Ich habe ein Script geschrieben, dass diese Zombie Benutzer löschen kann:

Get-PublicFolder "\" -recurse -resultsize unlimited | Get-PublicFolderClientPermission | Where { $_.User.ToString().Contains("NT User:") -eq $true } | Remove-PublicFolderClientPermission -confirm:$false

Es werden alle Zombie User gelöscht, die Berechtigungen in der gesammten öffentlichen Ordner Struktur hatten.

PowerShell – Nützliche Exchange Server 2010 Befehle

Da sich die PowerShell Befehle für den Exchange Server großer Beliebtheit erfreuen, habe ich mal ein paar neue Befehle hinzugefügt.

Exchange Server – ActiveSync

Liste aller ActiveSync Geräte

Get-ActiveSyncDevice | ft

ActiveSync-Statistik eines Postfaches

Get-ActiveSyncDeviceStatistics -mailbox "manuel.maliszewski"

Alle ActiveSync Geräte der OU „Ausgeschiedene User“ löschen

Get-ActiveSyncDevice -OrganizationalUnit "Ausgeschiedene User" | Remove-ActiveSyncDevice

Exchange Server – Datenbanken

Übersicht über Datenbanken und deren Größe

Get-MailboxDatabase -Status | ft name, databasesize

Übersicht über Datenbanken mit Informationen zu Retentation und Recoverable Quotas

Get-MailboxDatabase | Select Name, Server, MailboxRetention, Recoverab* |ft

Exchange Server – Postfächer

Übersicht der Postfächer einer Datenbank – Sortiert nach letztem Login mit den Feldern: Benutzername, Größe, Datum der letzten Anmeldung, Letzte Anmeldung

Get-Mailbox -Database "Berlin II - Datenbank II" | Get-MailboxStatistics | Sort LastLogonTime | ft DisplayName, TotalItemSize, LastLogonTime, LastLoggedOnUserAccount

Detailiert Übersicht eines Postfaches mit Unterordnern und dessen Größe

Get-MailboxFolderStatistics -identity "manuel.maliszewski" | ft FolderPath, FolderSize, ItemsInFolder, FolderAndSubfolderSize

Alle Postfächer mit Weiterleitung

Get-Mailbox | Where-Object { $_.ForwardingAddress –ne $null } | Select Name, ForwardingAddress

Alle Postfächer mit „Sende als“ und „volle Postfachberechtigung“

Get-Mailbox | Get-ADPermission | Where-Object { ($_.ExtendedRights -like "*send-as*") -and -not ($_.User -like "nt authority\self") }

Postfächer auf die der Benutzer „chilli“ volle Berechtigungen hat

Get-Mailbox | Get-MailboxPermission | Where-Object { ($_.AccessRights -eq "*fullaccess*") -and ($_.User -like "*chilli*") }

Exchange Server – Warteschlange

Warteschlange anzeigen auf Server S8K011

Get-Queue -Server S8K011

Warteschlangen Queue verschieben

./Move-TransportDatabase.ps1 –QueueDatabasepath “C:\Queue” –QueueDatabaseLoggingPath “D:\Queue”

Exchange Server – System

Alle Exchange-Dienste starten

Test-ServiceHealth | Select ServicesNotRunning | foreach { Start-Service $_.ServicesNotRunning }

Exchange-Dienste Status in Tabelle

Test-ServiceHealth | ft

Testet die Exchange Organisation auf Fehler

Test-SystemHealth

Exchange Server – Verschiedenes

Sprache aller Postfächer auf dem Server S8K011 auf Deutsch setzen

Get-Mailbox -Server S8K011 | Set-Mailbox -language de-DE

Sprache der Postfächer auf Server S8K012 anzeigen, nach Sprache sortieren und als Tabelle mit Namen und Sprache anzeigen

Get-Mailbox -Server S8K012 | sort Languages | ft name, Languages

Liste der Benutzer die den Abwensenheitsassistenten aktiviert haben

Get-Mailbox | Get-MailboxAutoReplyConfiguration | Where-Object { $_.AutoReplyState –eq “scheduled” }

Datenbank – RPC CAS abfragen

Get-MailboxDatabase -Server s8k011 | fl name, rpc\*

Datenbank-Index

Standardmäßig werden alle Datenbanken mit aktiviertem Index angelegt. in diesem Ordner wird der Index erstellt: %datenbankpfad%\CatalogData-Guid. Diesen kann man allerdings aktivieren:

Set-MailboxDatabase MailboxDatabaseName -IndexEnabled:$false

Erste Datenbank löschen

Beim Installieren von Exchange Server 2010 wird automatisch eine Datenbank angelegt. Diese Läst sich nicht über die Gui löschen, auch wenn alle Postfächer verschoben sind. Darum muss man die

System-Postfächer verschieben:

Get-mailbox -Arbitration | New-MoveRequest -TargetDatabase "Berlin I - Postfach I"

Danach muss man noch die Verschiebungsanforderungen löschen und die Datenbank ist entfernbar.

Scripts

Alle Mitglieder einer Gruppe anzeigen und das bis zu 5 Ebenen.

Import-Module ActiveDirectory
$DG = Read-Host

function Get-MySubGroupMembersRecursive
{
	$Mitglieder = Get-ADGroupMember $DG
	ForEach ($Mitglieder in $Mitglieder)
	{
		If ($Mitglieder.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive1
		}
		If ($Mitglieder.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive1
{
	$Mitglieder2 = Get-ADGroupMember $Mitglieder.Name
	ForEach ($Mitglieder2 in $Mitglieder2)
	{
		If ($Mitglieder2.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive2
		}
		If ($Mitglieder2.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder2.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive2
{
	$Mitglieder3 = Get-ADGroupMember $Mitglieder2.Name
	ForEach ($Mitglieder3 in $Mitglieder3)
	{
		If ($Mitglieder3.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive3
		}
		If ($Mitglieder3.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder3.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive3
{
	$Mitglieder4 = Get-ADGroupMember $Mitglieder3.Name
	ForEach ($Mitglieder4 in $Mitglieder4)
	{
		If ($Mitglieder4.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive4
		}
		If ($Mitglieder4.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder4.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive4
{
	$Mitglieder5 = Get-ADGroupMember $Mitglieder4.Name
	ForEach ($Mitglieder5 in $Mitglieder5)
	{
		If ($Mitglieder5.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive5
		}
		If ($Mitglieder5.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder5.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive5
{
	$Mitglieder6 = Get-ADGroupMember $Mitglieder6.Name
	ForEach ($Mitglieder6 in $Mitglieder6)
	{
		If ($Mitglieder6.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder6.Name)
		}
	}
}

Get-MySubGroupMembersRecursive

Exchange Server 2010 – Admin Audit Log & Mailbox Audit Log

Admin Audit Log

Mit der Administrator Überwachungsprotokollierung können Änderungen von Administratoren bzw. Benutzern an der Exchange Organisation überwacht werden. Es werden alle Cmdlets überwacht, die aus der Verwaltungs-Konsole, Verwaltungs-Shell und Web-Verwaltungsoberfläche aufgerufen werden.

Konfiguration der Administrator Überwachungsprotokollierung

Die Administrator Überwachungsprotokollierung muss einmalig für die Organisation aktiviert werden:

  • Protokollierung aktivieren: Set-AdminAuditLogConfig -AdminAuditLogEnabled $True
  • Protokollierung von Test-Cmdlets deaktivieren: Set-AdminAuditLogConfig -TestCmdletLoggingEnabled $False
  • Dauer der Protokollierung definieren: Set-AdminAuditLogConfig -AdminAuditLogAgeLimit 90.00:00:00

Beispiel

Nach allen Änderungen suchen, die der User „Admin“ getätigt hat.

Search-AdminAuditLog -UserID Admin

Nach allen Änderungen suchen, die der User „Admin“ zwischen dem 1.1.2010 und dem 7.2.2013 getätigt hat und das Ergebnis an admin@test.local per E-Mail senden.

New-AdminAuditLogSearch -UserIds admin -StatusMailRecipients admin@test.local -StartDate 1/1/2010 -EndDate 7/2/2013

Mailbox Audit Log

Mit der Mailbox Überwachungsprotokollierung können Logins und Änderungen an einem Postfach nachvollzogen werden. Standardmäßig ist diese deaktiviert. Die Überwachung muss für jedes Postfach einzeln aktiviert werden.

Mailbox Audit Logging für alle Postfächer aktivieren

Get-Mailbox | Set-Mailbox -AuditEnabled $true

Beispiel

Search-MailboxAuditLog -ShowDetails | ft LogonUserDisplayName, LogonType, LastAccessed, ItemSubject

Exchange Server 2010 – Automapping deaktivieren

Wenn man einem Benutzer volle Berechtigungen auf ein anderes Postfach gewährt, wird dieses Postfach automatisch in Outlook eingebunden. Das kann Vor- und Nachteile haben und da diese Funktion standardmäßig aktiviert ist, sollte man sie auch deaktivieren können.

Add-MailboxPermission -Identity “vorname.nachname” -User Administrator-AccessRights Fullaccess -AutoMapping $false

Wenn man allerdings bereits Fullaccess Rechte verteilt hat, muss man diese aus dem User Object im ADSI-Editor löschen.

  • User Object mit Eigenschaften öffnen
  • Attribut-Editor auswählen
  • Das Attribut msExchDelegateListLink auswählen und den entsprechenden Eintrag löschen

Exchange Server 2013 – Getrennte Postfächer anzeigen & löschen

Die getrennten Postfächer werden nur einmal täglich, je nach Konfiguration meistens in der Nacht, aktualisiert. Wenn man also ausversehen einen Benutzer gelöscht hat, muss man dadurch unter Umstäden einen Tag warten. Um dies zu beschleunigen um das Postfach schnell wieder verbinden zu können oder das Postfach zu löschen, kann die Powershell benutzt werden.

Möglicher Status

Gelöschte Postfächer können verschiedenen Status haben.

Disbabled

Wenn ein Postfach den Status Disabled hat, wurde der User oder auch nur das Postfach gelöscht.

SoftDeleted

Wenn ein Postfach in eine andere Datenbank verschoeben wurde, bleibt es in der alten Datenbank mit dem Status SoftDeleted erhalten. Die Dauer ist konfiguriertbar.

Getrennte Postfächer aktualisieren

Hiermit werden Postfächer die grade gelöscht wurden, für alle Datenbanken sofort als getrennt angezeigt:

Get-MailboxDatabase | Clean-MailboxDatabase

Nun kann man diese in der Exchange Verwaltungskonsole anzeigen lassen und ggf. schnell wiederverbinden.

Getrennte Postfächer löschen

Wenn man die Postfächer sofort löschen und die Aufbewahrungszeit außerkraft zu setzen will, kann dies folgendermaßen geschehen. Erst müssen die gelöschten Postfächer ausgelesen werden, um die Identity zu bekommen. Diese kann dann genutzt werden, um das Postfach zu löschen:

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

Disabled Postfächer löschen

Diese Identity kann nun verwendet werden, um das Postfach mit dem Status „Disabled“ in der Datenbank „Datenbank“ zu löschen:

Remove-StoreMailbox -Database “Datenbank” -Identity “3242341-3d35-34f8-4324-asdkasdj34jfs” -MailboxState “Disabled”

SoftDeleted Postfächer löschen

Diese Identity kann nun verwendet werden, um das Postfach mit dem Status „SoftDeleted“ in der Datenbank „Datenbank“ zu löschen:

Remove-StoreMailbox -Database “Datenbank” -Identity “3242341-3d35-34f8-4324-asdkasdj34jfs” -MailboxState “Softdeleted”

Exchange Server 2010 – IMAP, POP3 und SMTP Einstellungen im Outlook WebApp anzeigen

In Exchange Server 2010 ist es möglich, die Verbindungseinstellungen zu IMAP,POP3 und SMTP, im Outlook WebApp für die Benutzer zu veröffentlichen. Dazu muss die Powershell benutzt werden.

POP3 Einstellungen

Set-POPSettings -ExternalConnectionSettings "pop.domain.de:ssl"

IMAP Einstellungen

Set-IMAPSettings -ExternalConnectionSettings "imap.domain.de:993:ssl"

SMTP Einstellungen

ReceiveConnector -Identity "ServerName\Client ServerName" -AdvertiseClientSettings:$true

Beispiel

webmail

Exchange Server 2010 – HTML Dokumentation per Script

Auf der Homepage von Steve Goodmann kann man ein Script runterladen, dass die Dokumentation der Exchange-Umgebung im HTML-Format erstellen kann.

Beispiel

Active Directory – User Bilder – Outlook 2010 / Lync 2010 – Teil 2

Jetzt werde ich zeigen, wie man das zuvor aktivierte Feature auch benutzen kann, bzw. Bilder in das Active Directory laden kann.

Einschränkungen für Bilder

  • Bilder müssen kleiner als 10 KB sein
  • Bilder müssen im JPG oder GIF Format vorlieren

Bilder in das Active Directory laden

Dem Benutzer manuel.maliszewski wird das Bild „C:\Users\chilli\Desktop\manuel.maliszewski.jpg“ zugeordnet und hoch geladen.

Import-RecipientDataProperty -Identity manuel.maliszewski -Picture -FileData ([Byte[]]$(Get-Content -path "C:\Users\chilli\Desktop\manuel.maliszewski.jpg" -Encoding Byte -ReadCount 0))

Bilder hochladen automatisieren

Damit das folgendes Script funktioniert, müssen die Bilder im Verzeichnis „C:\Photos“ vorname.nachme.jpg heißen. Der Aufruf würde dann so aussehen: script.ps -all

param([Switch]$all, [String]$UserName)

#Default Values. Change them based on your environment.
$DefaultPhotoPath = 'C:\Photos'

Function CheckPhoto(){
 Write-Warning "Validating file(s).."
 Write-Host "File exists... " -nonewline
 If (Test-Path $PhotoPath)
 {
 Write-Host "[OK]" -ForeGroundColor Green
 Write-host "Photo size... " -nonewline
 $PhotoSize = Get-ChildItem $PhotoPath | select Length
 If ($PhotoSize.Length -le 10000) { Write-Host "[OK]" -ForeGroundColor Green } Else { Write-Host "[Fail]" -ForeGroundColor Red; exit }
 }
 Else
 {
 Write-Host "[Fail]" -ForeGroundColor Red
 Exit
 }
}

Function UploadAll(){
 ForEach ($TempFile in Get-ChildItem $DefaultPhotoPath | Where-Object { $_.Extension -eq ".jpg" } )
 {
  $TempUserName = $TempFile.Name.substring(0, $TempFile.Name.Length - 4)
  Write-Host $TempUserName -ForeGroundColor Yellow -NoNewLine
  Import-RecipientDataProperty -Identity $TempUserName -Picture -FileData ([Byte[]]$(Get-Content -path $TempFile.Fullname -Encoding Byte -ReadCount 0))
  Write-Host "[Done]" -ForeGroundColor Green
 }
}

If ( $all -eq $true)
 {
 Write-Warning " ## This action will upload all pictures of C:\Photos to the AD users."
 Write-Warning " ## All pictures must have the same name of the usernames"
 Write-Warning "Are you sure that you want upload all pictures to the users (Y/N)?"
 $Opt = Read-Host
 If ( $Opt -eq 'y' ) { UploadAll; } Else { Write-Host "No changes were made."; Exit }
 }
Else
 {
 $PhotoPath = $DefaultPhotoPath + $UserName + '.jpg'
 CheckPhoto;
 If ( $AbortMission -eq '$true' ) { Write-Error "Please, review the errors and try again." } Else { Import-RecipientDataProperty -Identity $UserName -Picture -FileData ([Byte[]]$(Get-Content -path $PhotoPath -Encoding Byte -ReadCount 0)) }
 }

Dateinamen anpassen

Um den Upload Prozess zu automatisieren, ist es sinnvoll alle Bilder in dem Syntax vorname.nachname.jpg zu speichern. Da das in der Regel nicht der Fall ist, kann mit einigen Tools Dateinamen umbenennen. Wir haben z.B. Bilder im Format Nachname-Vorname_s.jpg und müssen diese entsprechend anpassen. Dafür kann man z.B. Total Commander benutzen und mit dem Dateiumbennenungs-Feature arbeiten.

In dem Beispiel würde das dann so aussehen:

Suchen nach: (.*)\-(.*)\_s.jpg
Ersetzen mit: $2.$1.jpg

Links

Active Directory – User Bilder – Outlook 2010 / Lync 2010 – Teil 1

Um jedem Active Directory Benutzer ein Bild zuzuordnen, muss erstmal ein bisschen was konfiguriert werden.

Active Direcory

DLL regestrieren

Um die Bilder im Active Directory aktivieren zu können, muss zuerst eine DLL registriert werden.

Start -> Ausführen -> regsvr32 schmmgmt.dll

Active Directory Schema

Jetzt muss das Attribut des Bildes auf allen Globalen Katalog Server repliziert werden.

  • Im ADSI-Editor das User Objekt öffnen
  • Das Attribut thumbnailPhoto öffnen
  • Die Eigenschaft „Replicate this attribute to the Global Catalog“ aktivieren

Offline Adressbuch

Jetzt muss das Offline Adressbuch angepasst werden. Damit werden die Bilder dem OAB hinzugefügt und stehen damit dem Exchange Cache-Modus zur Verfügung.

Attribut löschen

$attributes = (Get-OfflineAddressBook).ConfiguredAttributes
$attributes.Remove("thumbnailphoto,Indicator")
Get-OfflineAddressBook | Set-OfflineAddressBook -ConfiguredAttributes $attributs

Neues Attribute hinzufügen

Nun kann das Attribut mit dem Bild dem OAB hinzugefügt werden.

$attributes.Add("thumbnailphoto,Value")
Get-OfflineAddressBook | Set-OfflineAddressBook -ConfiguredAttributes $attribute

Offline-Adressbuch regenerieren

Damit die Änderungen aktiviert werden, muss das OAB regeneriert werden.

Get-OfflineAddressBook | Update-OfflineAddressBook

Ergebnis in Outlook 2010 und Lync 2010

Blackberry Enterprise Server – Lync Integration

Lync 2010 kann mit dem Blackberry Enterprise Server verbunden werden. Somit kann man mit dem Blackberry über Lync schreiben und angeschrieben werden.

Blackberry Enterprise Server – Vorraussetzungen

  • Dot Net – Windows Feature installieren
  • C++ 2008 Runtime Installieren/li>
  • SQL Nativ Client 64 Bit Installieren/li>
  • Microsoft Unified Communications Managed API 2.0 Core Redist 64Bit Installieren/li>
  • Microsoft Unified Communications Managed API 2.0 Core Redist 64Bit – Update I Installieren/li>
  • Office Communications Server 2007 R2 Core Components Installieren

Blackberry Enterprise Server – Zertifikat

Der Blackberry Enterprise Server braucht ein Zertifikat, dass ihm die Verbindung zum Lync Server 2010 erlaubt. Das Zertifikat muss mit bestimmten Attributen angefordert werden, damit der BES die Zuordnung treffen kann. Das Zertifikat muss aus der Domänen CA kommen.

Eigenschaften

CN=S8K023.hypoport.local
DNS=S8K023.hypoport.local
Friendly-Name: OCSConnector

Zertifikat – Installation

Das angeforderte und ausgestellt Zertifikat von der Domänen CA muss in den lokalen Computer unter eigene Zertifikate importiert werden.

Activ Directory – Konfiguration

RTCUniversalAdmins – BESAdmin

BESAdmin der Gruppe RTCUniversalAdmins hinzufügen

Blackberry Enterprise Server – Collaboration Server

Blackberry Enterprise Server Collaboration muss installiert sein, damit Lync mit dem BES verknüpft werden kann.

Blackberry Enterprise Server Collaboration – Konfiguration

Instant Messaging Server-Pool: S8K023.hypoport.local
Blackberry Collaboration Service FQDN: S8KV004.hypoport.local
Protokoll: TLS
Port: 65061

Blackberry Enterise Server – Lync App verteilen

Damit jedes Blackberry automatisch den Enterprise Messenger für Lync erhält, muss dieser per Software-Richtlinie an alle Blackberrys verteilt werden.
Blackberry Enterprise Server – Enterprise Messenger

  • Enterprise Messenger als Anwendung importieren
  • Softwarekonfigurationsgruppe anpassen