mosurama
Goto Top

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

Content-ID: 314064

Url: https://administrator.de/contentid/314064

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

Mosurama
Mosurama 31.08.2016 um 22:17:39 Uhr
Goto Top
OK, für mein erstes Problem, der Freigabe der Kalender hatte ich wohl Tomaten auf den Augen:

mit

Add-MailboxFolderPermission -identity “username:\kalender” –user “domain\username” -AccessRights Reviewer

scheint das zu klappen

bleibt noch mein Problem, ob ich es den Usern erleichtern kann, die Kalender hinzufügen zu müssen
VGem-e
VGem-e 01.09.2016 um 07:39:59 Uhr
Goto Top
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
vBurak
vBurak 01.09.2016 um 08:52:12 Uhr
Goto Top
Will man wirklich 50 Kalender in Outlook aufmachen? Ich bezweifel, dass man die alle ständig anschauen möchte.

Man kann doch einfach "Kalender öffnen" in Outlook und dann den Benutzer auswählen. Das sind zwei Klicks.
VGem-e
VGem-e 01.09.2016 um 09:51:12 Uhr
Goto Top
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
Mosurama
Mosurama 01.09.2016 um 10:26:57 Uhr
Goto Top
Es geht nicht darum, die 50 alle gleichzeitig aufzumachen. Aber in der Übersicht der Kalender sollen die alle erscheinen, damit für Terminabstimmungen die jeweiligen User nur angeklickt werden müssen. Hier jedesmal, wenn man einen neuen braucht, erst über Kalender öffnen - Namen aus der Liste wählen - insbesondere für Empfangs- und Assistenzkräfte ein gewisses zeitliches Problem.

Auto-Mapping würde in meinem Fall auch nichts bringen weil kein Full Access bei den Mailboxen eingerichtet werden.

Aber gut, dann wird es darauf hinauslaufen, dass sich jeder einmalig alle Kalender hinzufügen darf

Vielen Dank an alle, die nachgedacht haben
VGem-e
VGem-e 01.09.2016 um 16:46:09 Uhr
Goto Top
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ß
colinardo
Lösung colinardo 01.09.2016, aktualisiert am 16.05.2024 um 14:19:32 Uhr
Goto Top
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 face-wink), hier der Code für die EMS. Bitte Kommentare lesen vor dem Ausführen !

back-to-topRechte 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}  
}

back-to-topAutomatisches 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:

screenshot

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
colinardo
colinardo 06.09.2016 aktualisiert um 17:02:58 Uhr
Goto Top
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.
Mosurama
Mosurama 07.09.2016 um 12:44:44 Uhr
Goto Top
Hi,

sorry, die Migrationsnacharbeiten gingen erst gestern Abend zu Ende.

Das erste Script war super, das zweite haben wir nach ersten Tests dann doch nicht gebraucht, sobald eine gewisse Anzahl von Kalendern hinzugefügt wurde, wurde das ganze zäh und unübersichtlich so dass sie sich jetzt dazu entschlossen haben, selektiv zu arbeiten.

Aber vielen Dank für die Scripte, ich bin sicher, ich kann sie anderswo auch noch einsetzen
Mosurama
Mosurama 07.09.2016 um 12:45:35 Uhr
Goto Top
PS: Ein Fehler i Text: Exfolders funktioniert unter Exchange 2013 nicht mehr
Apenimb
Apenimb 21.04.2022, aktualisiert am 22.04.2022 um 00:09:06 Uhr
Goto Top
Hallo,

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
colinardo
colinardo 22.04.2022 aktualisiert um 10:34:38 Uhr
Goto Top
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
Get-MailboxFolderPermission "$($box.alias):\$calname" | ?{$_.User.RecipientPrincipal.alias -in $mailboxes.Alias} | %{Remove-MailboxFolderPermission $_.Identity -User $_.User.RecipientPrincipal.alias -Confirm:$false}  
ersetzen, welche vorher mittels where-object die Existenz von Mailbox-Berechtigungen filtert.

Grüße Uwe
Apenimb
Apenimb 22.04.2022 um 11:13:19 Uhr
Goto Top
Super Danke für die Info