isoldebaden
Goto Top

Exchange Kalendereinträge anpassen via powershell

Hallo Leute,

ist es möglich per Powershell Kalendereinträge eines Raum- bzw. Gerätepostfaches anzupassen? Es geht mir speziell darum, dass das Skript Termine, die als "Frei" angezeigt werden, auf "Beschäftigt" setzt.
Es handelt sich um Exchange 2013 und Outlook 2010.

Danke im Voraus!

Gruß

Content-ID: 367133

Url: https://administrator.de/forum/exchange-kalendereintraege-anpassen-via-powershell-367133.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

colinardo
Lösung colinardo 06.03.2018, aktualisiert am 07.03.2018 um 07:16:38 Uhr
Goto Top
Servus.
ist es möglich per Powershell Kalendereinträge eines Raum- bzw. Gerätepostfaches anzupassen?
mit ein bißchen EWS kein großes Problem

(benötigt die "Microsoft.Exchange.WebServices.dll" welche hier heruntergeladen werden kann und ins selbe Verzeichnis gelegt werden muss)
<#
   Vor dem Start des Skript ist dem User welcher das Skript später ausführt die Impersonation-Berechtigungzu erteilen:
   In diesem Beispiel der User 'Administrator' (Bitte einmalig in einer EMS ausführen)  

    New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:Administrator
#>

# Start Variablen -------------------------------------------------------------------------
# FQDN des Exchange
$exserver = "ex.domain.tld"  
# Name des Raum-/Gerätepostfachs
$mailbox = "Raumpostfach@domain.tld"  

# Ende Variablen -------------------------------------------------------------------------

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

# Active Directory Modul laden
Import-Module ActiveDirectory

# EWS DLL laden
Add-Type -Path "$PSScriptRoot\Microsoft.Exchange.WebServices.dll"  

# Allen Zertifikaten vertrauen
Add-Type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# EWS Objekt erstellen
$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013)
$ews.Url = "https://$exserver/ews/exchange.asmx"  
# Benutze die Credentials mit dem das Skript ausgeführt wird
$ews.UseDefaultCredentials = $true
$ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, [string]$mailbox)


# -----------------------------
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(10000)
$view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$result = $ews.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$view)
$result.Items | ?{$_.LegacyFreeBusyStatus -eq [Microsoft.Exchange.WebServices.Data.LegacyFreeBusyStatus]::Free} | %{
    $_.LegacyFreeBusyStatus = [Microsoft.Exchange.WebServices.Data.LegacyFreeBusyStatus]::Busy
    $_.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AutoResolve)
}


Alternativ geht das natürlich auch über ein Outlook-Client-Skript wenn der User entsprechende Rechte am Raumpostfachkalender besitzt.

Outlook öffnen und dann zum Raumpostfach-Kalender navigieren (und dieses selektiert lassen!), dann folgendes Powershell-Skript aufrufen und freuen face-wink.
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
$objOL.ActiveExplorer().CurrentFolder.Items | ?{$_.BusyStatus -eq 0} | %{$_.BusyStatus = 2; $_.Save()}

Grüße Uwe
IsoldeBaden
IsoldeBaden 07.03.2018 um 09:27:53 Uhr
Goto Top
Hallo Uwe,

danke dir! Genau so hatte ich mir das vorgestellt. Hammer! face-smile

Danke für eine Mühe!

Gruß
colinardo
colinardo 07.03.2018 um 09:32:27 Uhr
Goto Top
Immer gerne face-smile.