Exchange Einführung - Kalender aller User untereinander freigeben und hinzufügen
Guten Abend,
ich stehe vor folgender "Herausforderung":
In einem 50-Mann-Unternehmen wird von Tobit auf Exchange 2013 und Outlook 2013 umgestellt.
In Tobit waren bislang alle Kalender für alle anderen freigegeben und die User haben sich alle Kalender der anderen Usern eingeblendet.
Nun wechselt das Unternehmen nach Exchange.
Um das Leben einfacher zu machen stellt sich die Frage, ob man die Freigabe aller Kalender für alle Benutzer eventuell durch ein Powershell Script machen könnte und ob es eine automatisierte Möglichkeit gibt, alle Kalender aller Benutzer ins eigene Outlook einzubinden
Die Freigabe der Kalender würde ich sofern nicht anders machbar mit Exfolders machen, aber für das hinzufügen der Kalender habe ich bislang keine Möglichkeit gefunden.
Ich bin für jeden Hinweis dankbar, vielen Dank
Andreas
ich stehe vor folgender "Herausforderung":
In einem 50-Mann-Unternehmen wird von Tobit auf Exchange 2013 und Outlook 2013 umgestellt.
In Tobit waren bislang alle Kalender für alle anderen freigegeben und die User haben sich alle Kalender der anderen Usern eingeblendet.
Nun wechselt das Unternehmen nach Exchange.
Um das Leben einfacher zu machen stellt sich die Frage, ob man die Freigabe aller Kalender für alle Benutzer eventuell durch ein Powershell Script machen könnte und ob es eine automatisierte Möglichkeit gibt, alle Kalender aller Benutzer ins eigene Outlook einzubinden
Die Freigabe der Kalender würde ich sofern nicht anders machbar mit Exfolders machen, aber für das hinzufügen der Kalender habe ich bislang keine Möglichkeit gefunden.
Ich bin für jeden Hinweis dankbar, vielen Dank
Andreas
Please also mark the comments that contributed to the solution of the article
Content-ID: 314064
Url: https://administrator.de/contentid/314064
Printed on: October 7, 2024 at 02:10 o'clock
13 Comments
Latest comment
Moin,
wir hatten dies mit EXC und Outlook so gelöst, dass jeder User den eigenen Kalender führt, in den Termine/Projekte eingetragen sind, die nur den eigenen Arbeitsbereich betreffen.
Zusätzlich existiert bei uns ein zentraler Kalender, in den von uns und den angeschlossenen Außenstellen üblicherweise übergreifende Termine und längere Abwesenheiten (z.B. Urlaub, Lehrgang etc.) eingetragen sind; diese Abwesenheiten jedoch werden nur mit dem Namen des Sachbearbeiters versehen und aus Datenschutzgründen nicht mit dem Grund der Abwesenheit (geht ja andere Kollegen nichts an, sollte jemand z.B. wg. eines Klinikaufenthalts mal länger ausfallen).
Gruß
VGem-e
wir hatten dies mit EXC und Outlook so gelöst, dass jeder User den eigenen Kalender führt, in den Termine/Projekte eingetragen sind, die nur den eigenen Arbeitsbereich betreffen.
Zusätzlich existiert bei uns ein zentraler Kalender, in den von uns und den angeschlossenen Außenstellen üblicherweise übergreifende Termine und längere Abwesenheiten (z.B. Urlaub, Lehrgang etc.) eingetragen sind; diese Abwesenheiten jedoch werden nur mit dem Namen des Sachbearbeiters versehen und aus Datenschutzgründen nicht mit dem Grund der Abwesenheit (geht ja andere Kollegen nichts an, sollte jemand z.B. wg. eines Klinikaufenthalts mal länger ausfallen).
Gruß
VGem-e
Servus,
@vBurak:
Genau deshalb 2 Kalender (1x eigener Kalender, 1x zentraler Kalender), die je nach Vorliebe des Benutzers nebeneinander oder übereinander liegen können sind und die Termine anzeigen.
Gruß
VGem-e
@vBurak:
Genau deshalb 2 Kalender (1x eigener Kalender, 1x zentraler Kalender), die je nach Vorliebe des Benutzers nebeneinander oder übereinander liegen können sind und die Termine anzeigen.
Gruß
VGem-e
Servus,
@Mosurama:
Wir lösen dies üblicherweise so, dass derjenige Mitarbeiter, der eine Besprechung mit weiteren Kollegen durchführen will, einfach übers Outlook eine neue Besprechung anlegt und dazu übers Outlook entsprechende Einladungen versendet (geht evtl. auch anders/einfacher?) Dies funktioniert hier ganz gut.
Gruß
@Mosurama:
Wir lösen dies üblicherweise so, dass derjenige Mitarbeiter, der eine Besprechung mit weiteren Kollegen durchführen will, einfach übers Outlook eine neue Besprechung anlegt und dazu übers Outlook entsprechende Einladungen versendet (geht evtl. auch anders/einfacher?) Dies funktioniert hier ganz gut.
Gruß
Hallo Andreas,
also die Berechtigungen kannst du ja per Powershell schnell selbst auf dem Exchange mit for-schleife über alle user (Get-AdUser/Get-Mailbox) skripten (Add-MailboxFolderPermission).
Falls du dazu noch nicht in der Lage bist (hoffentlich bald ), hier der Code für die EMS. Bitte Kommentare lesen vor dem Ausführen !
Für das Hinzufügen der Kalender zur Gruppe der freigegebenen Kalender in Outlook kannst du folgendes Client-Powershell-Skript bemühen, das automatisiert das Hinzufügen der freigegeben Kalender zu den Navigationpanes im Kalenderabschnitt.
Dazu gibt man in der zweiten Zeile den DistinguishedName (DN) einer Gruppe an in der die gewünschten Nutzer Mitglied sind. Am besten eine extra Gruppe dafür erstellen.
Damit die User keine Benachrichtigung über skriptgesteuerten Zugriff bekommen, noch die folgende Einstellung im Outlook TrustCenter aktivieren:
Das macht man dann am besten per GPO, denn wenn man es von hand lokal macht muss man Outlook sonst einmalig als Administrator starten, und das wäre ja blöd.
Die Schritte die der Code vollzieht sind jeweils kommentiert.
Kurzbeschreibung: Das Skript holt sich die Liste der User via LDAP aus dem AD öffnet Outlook via COM-Object Instanz, iteriert über alle User und fügt diese der Kalenderpane unter der Gruppe Freigegebene Kalender hinzu, passende Berechtigung s.o. natürlich vorausgesetzt. Die Navigations-Gruppe unter der die Kalender hinzugefügt werden kann aber bei Bedarf in der Funktion Add-SharedCalendarToOutlook mit dem Parameter -defaultpane angepasst werden, auch benutzerdefinierte Ordner sind mit der Funktion möglich (siehe die Beispiele in der Beschreibung zur Funktion).
Dies ist ein Client-Skript es muss also auf jedem Client einmalig ausgeführt werden.
Hoffe das hilft dir weiter.
Viel Erfolg!
Grüße Uwe
also die Berechtigungen kannst du ja per Powershell schnell selbst auf dem Exchange mit for-schleife über alle user (Get-AdUser/Get-Mailbox) skripten (Add-MailboxFolderPermission).
Falls du dazu noch nicht in der Lage bist (hoffentlich bald ), hier der Code für die EMS. Bitte Kommentare lesen vor dem Ausführen !
Rechte auf die Mailboxen vergeben
<#
Mailboxen gegenseitigen Zugriff auf den Kalender geben
#>
# Zuweisbare Rechte
# Kombinierbare Rechte sind folgende
<#
- CreateItems Der Benutzer kann Elemente im angegebenen Ordner erstellen.
- CreateSubfolders Der Benutzer kann Unterordner im angegebenen Ordner erstellen.
- DeleteAllItems Der Benutzer kann alle Elemente im angegebenen Ordner löschen
- DeleteOwnedItems Der Benutzer kann nur die Elemente löschen, die im angegebenen Ordner erstellt wurden.
- EditAllItems Der Benutzer kann alle Elemente im angegebenen Ordner bearbeiten.
- EditOwnedItems Der Benutzer kann nur die Elemente bearbeiten, die im angegebenen Ordner erstellt wurden.
- FolderContact Der Benutzer ist der Kontakt für den angegebenen Öffentlichen Ordner.
- FolderOwner Der Benutzer ist der Besitzer des angegebenen Ordners. Der Benutzer kann den Ordner anzeigen, den Ordner verschieben und Unterordner erstellen. Der Benutzer darf keine Elemente lesen, bearbeiten, löschen oder erstellen.
- FolderVisible Der Benutzer kann den angegebenen Ordner anzeigen, darf jedoch in diesem Ordner keine Elemente lesen oder bearbeiten.
- ReadItems Der Benutzer kann Elemente im angegebenen Ordner lesen.
#>
$rights = "FolderVisible","ReadItems"
# Maiboxen definieren (hier nur Usermailboxen)
$mailboxes = Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize unlimited
$mailboxes | %{
$box = $_
# Kalendername extrahieren (Grund: Diese sind sprachabhängig je nachdem welche Sprache die Mailbox hat)
$calname = [string](Get-mailboxfolderstatistics $box -folderscope calendar | ?{$_.FolderType -eq 'Calendar'} | select -First 1).Name
# Allen mailboxen (außer der eigenen) Zugriffsrechte auf den Kalender vergeben
$mailboxes.Alias | ?{$_ -ne $box.Alias} | %{Add-MailboxFolderPermission "$($box.alias):\$calname" -AccessRights $rights -User $_ -Confirm:$false}
}
Automatisches Hinzufügen der Kalender zur Gruppe der freigegebenen Kalender in Outlook
Für das Hinzufügen der Kalender zur Gruppe der freigegebenen Kalender in Outlook kannst du folgendes Client-Powershell-Skript bemühen, das automatisiert das Hinzufügen der freigegeben Kalender zu den Navigationpanes im Kalenderabschnitt.
Dazu gibt man in der zweiten Zeile den DistinguishedName (DN) einer Gruppe an in der die gewünschten Nutzer Mitglied sind. Am besten eine extra Gruppe dafür erstellen.
Damit die User keine Benachrichtigung über skriptgesteuerten Zugriff bekommen, noch die folgende Einstellung im Outlook TrustCenter aktivieren:
Das macht man dann am besten per GPO, denn wenn man es von hand lokal macht muss man Outlook sonst einmalig als Administrator starten, und das wäre ja blöd.
Die Schritte die der Code vollzieht sind jeweils kommentiert.
Kurzbeschreibung: Das Skript holt sich die Liste der User via LDAP aus dem AD öffnet Outlook via COM-Object Instanz, iteriert über alle User und fügt diese der Kalenderpane unter der Gruppe Freigegebene Kalender hinzu, passende Berechtigung s.o. natürlich vorausgesetzt. Die Navigations-Gruppe unter der die Kalender hinzugefügt werden kann aber bei Bedarf in der Funktion Add-SharedCalendarToOutlook mit dem Parameter -defaultpane angepasst werden, auch benutzerdefinierte Ordner sind mit der Funktion möglich (siehe die Beispiele in der Beschreibung zur Funktion).
Dies ist ein Client-Skript es muss also auf jedem Client einmalig ausgeführt werden.
# distinguishedName of the group in which the users are members
$group = 'CN=TestGruppe,CN=Users,DC=domain,DC=de'
# fetch all users of group without current user
$users = [adsisearcher]::new("(&(objectCategory=User)(memberof=$group))","SamAccountName").FindAll() | %{$_.Properties['SamAccountName']} | ?{$_ -ne $env:Username}
# function which adds shared calendars to outlook.
function Add-SharedCalendarToOutlook {
<#
.Synopsis
Add shared calendars to outlook
.DESCRIPTION
Adds one or more shared calendars to outlook
.EXAMPLE
Add-SharedCalendarToOutlook -calendar 'maxmuster','shared@domain.tld' -defaultpane olPeopleFoldersGroup -verbose
Add two shared calendars to the default MyFolders group of outlook
.EXAMPLE
Add-SharedCalendarToOutlook -calendar 'maxmuster','shared@domain.tld' -custompane 'MyTestGroup' -verbose
Add two shared calendars to a custom group named 'MyTestGroup'
.NOTES
To specify calendars you can use the name, alias or e-mail address of the mailbox in which the calendar resides.
To close outlook after adding the calendars you can add the switch '-closeoutlook'
#>
[cmdletbinding(SupportsShouldProcess=$true)]
param(
# name, alias or e-mail address of the mailbox from which to add the shared calendar
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string[]]$calendar,
# specify on of the default outlook navigation panes to add the calendar as a childfolder
[parameter(mandatory=$false,ParameterSetName='defaultpane')][ValidateSet('olMyFoldersGroup','olOtherFoldersGroup','olPeopleFoldersGroup','olRoomsGroup')][string]$defaultpane = 'olPeopleFoldersGroup',
# specify a name of a custom folder to add the calendar as a childfolder
[parameter(mandatory=$false,ParameterSetName='custompane')][string]$custompane,
# to close the outlook process after processing add this switch
[parameter(mandatory=$false)][switch]$closeoutlook
)
$ErrorActionPreference = 'Stop'
# pane mapping to values
$defaultpane_map = @{
olCustomFoldersGroup = 0
olFavoriteFoldersGroup = 4
olMyFoldersGroup = 1
olOtherFoldersGroup = 3
olPeopleFoldersGroup = 2
olRoomsGroup = 5
}
try{
$ol = $null
# get outlook com-object
try{
$ol = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Outlook.Application')
}catch{
$ol = New-Object -Com Outlook.Application
}
# get mapi namespace reference
$ns = $ol.GetNamespace("MAPI")
# get calendar nav module
$navMod = $ns.GetDefaultFolder(9).GetExplorer().NavigationPane.Modules.GetNavigationModule(1)
# get navigation subgroup
if($PSCmdlet.ParameterSetName -eq 'defaultpane'){
$navGroup = $navMod.NavigationGroups.GetDefaultNavigationGroup($defaultpane_map[$defaultpane])
}else{
$navGroup = $navMod.NavigationGroups | ?{$_.Name -eq $custompane -and $_.GroupType -eq 0}
if (!$navGroup){
throw "Navigation group '$custompane' not found!"
}
}
# for each calendar ...
foreach($user in $calendar){
try{
# create receipient object
$recipient = $ns.CreateRecipient($user)
# resolve receipient
$recipient.Resolve() | out-null
# if recipient found
if ($recipient.Resolved){
if ($PSCMDLet.ShouldProcess($recipient.Name,"Adding calendar to group '$($navGroup.Name)'")){
# get calendar folder reference of recipient
$cal = $ns.GetSharedDefaultFolder($recipient, 9)
if($cal){
# add calendar to calendar navigation pane
$navGroup.NavigationFolders.Add($cal) | out-null
}else{
throw "Calendar of principal '$user' could not be retrieved. Make sure the user has enough access rights."
}
}
}else{
throw "Recipient '$user' could not be resolved!"
}
}catch{
write-host $_.Exception.Message -F Red
}
}
}catch{
write-host $_.Exception.Message -F Red
}finally{
if($closeoutlook.IsPresent){
$ol.Quit()
}
# cleanup
if($ol){
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($ol)
}
}
}
# if there are members in the group
if ($users){
# use function to add calendars
Add-SharedCalendarToOutlook -calendar $users -defaultpane olPeopleFoldersGroup -verbose
}else{
write-warning "No members found in group '$group'."
}
Hoffe das hilft dir weiter.
Viel Erfolg!
Grüße Uwe
Kommt hier noch was oder war's das ?
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen und Lösung markieren. Merci.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen und Lösung markieren. Merci.
Hallo,
kann ich die rechte einfach wieder mit Set-MailboxFolderPermission entfernen?
Viele Grüße
kann ich die rechte einfach wieder mit Set-MailboxFolderPermission entfernen?
# Maiboxen definieren (hier nur Usermailboxen)
$mailboxes = Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize unlimited
$mailboxes | %{
$box = $_
# Kalendername extrahieren (Grund: Diese sind sprachabhängig je nachdem welche Sprache die Mailbox hat)
$calname = [string](Get-mailboxfolderstatistics $box -folderscope calendar | ?{$_.FolderType -eq 'Calendar'} | select -First 1).Name
# Allen mailboxen (außer der eigenen) Zugriffsrechte auf den Kalender entfernen
$mailboxes.Alias | ?{$_ -ne $box.Alias} | %{Remove-MailboxFolderPermission "$($box.alias):\$calname" -User $_ -Confirm:$false}
}
Viele Grüße
Servus @Apenimb, willkommen auf Administrator.de!
Ja kannst du so machen, wenn du das Skript vorher schon angewendet hast. Bei nachträglichen manuellen Modfikationen an den Berechtigungen wird es aber so ein paar Fehler werfen wenn Berechtigungen von manchen Mailboxen fehlen, was aber keine Auswirkungen hat, die kannst du aber mittels -ErrorAction SilentlyContinue beim CMDLet Remove-MailboxFolderPermission unterdrücken wenn dich das stört.
Alternativ zur Fehlerunterdrückung lässt sich in deine Zeile 8 durch
ersetzen, welche vorher mittels where-object die Existenz von Mailbox-Berechtigungen filtert.
Grüße Uwe
Ja kannst du so machen, wenn du das Skript vorher schon angewendet hast. Bei nachträglichen manuellen Modfikationen an den Berechtigungen wird es aber so ein paar Fehler werfen wenn Berechtigungen von manchen Mailboxen fehlen, was aber keine Auswirkungen hat, die kannst du aber mittels -ErrorAction SilentlyContinue beim CMDLet Remove-MailboxFolderPermission unterdrücken wenn dich das stört.
Alternativ zur Fehlerunterdrückung lässt sich in deine Zeile 8 durch
Get-MailboxFolderPermission "$($box.alias):\$calname" | ?{$_.User.RecipientPrincipal.alias -in $mailboxes.Alias} | %{Remove-MailboxFolderPermission $_.Identity -User $_.User.RecipientPrincipal.alias -Confirm:$false}
Grüße Uwe