Here again a small script from the Quick&Dirty corner. Querying the calendar of a room mailbox via EWS and Powershell. The script retrieves all calendar entries from the current time to 365 days in the future, or a maximum of 200 entries. The results are saved in the variable $results and can then be processed further.
$MailboxName = "Besprechungsraum@frankysweb.de" $EWSPath = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" Add-Type -Path $EWSPath $version = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2 $service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService($version) $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$MailboxName); $service.AutodiscoverUrl($mailboxName) $calendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar) $calendarView = new-object Microsoft.Exchange.WebServices.Data.CalendarView([System.DateTime]::Now, [System.DateTime]::Now.AddDays(365)) $calendarView.MaxItemsReturned = 200; $calendarView.PropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $results = $calendar.FindAppointments($calendarView) $results | ft subject,start,end
In order to access a room mailbox via EWS, the user executing the script must have impersonation rights. The following command can be used to assign impersonation rights to a user:
New-ManagementRoleAssignment -Name impersonationAssignmentName -Role ApplicationImpersonation -User EWSServiceAccount
This gives the user "EWSServiceAccount" impersonation rights to all mailboxes, but this can also be further restricted:
New-ManagementScope -name meeting room -RecipientRestrictionFilter {Name -eq "meeting room"} New-ManagementRoleAssignment -Name impersonationAssignmentName -Role ApplicationImpersonation -User EWSServiceAccount -CustomRecipientWriteScope meeting room
The command above creates a new management area that only contains the "Meeting room" user. The impersonation rights therefore only apply to the EWSServiceAccount user for the "Meeting room" mailbox.
Das Script kann leider Inhalte eines Kalendereintrags nicht anzeigen, dazu muss FindItems statt FindAppointments verwendet werden.
Also die letzten zwei Zeilen durch diese drei ersetzen (getestet mit Exchange 2016):
$results = $service.FindItems($calendar.Id, $calendarView)
[Void]$Service.LoadPropertiesForItems($results, $calendarView.PropertySet)
$results | ft subject,start,end,location,Body
Hallo Gerd,
ich bekomme dann immer folgendes:
Exception calling „LoadPropertiesForItems“ with „2“ argument(s): „The collection is empty.
Parameter name: items“
At C:\Scripts\Manuell\Exchangekalender.ps1:19 char:1
+ [Void]$Service.LoadPropertiesForItems($results, $calendarView.Propert …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException
Eine Idee?
Das Skiprt fukntioniert auch mit Exchange 2016 gut.
Was muss eingetragen werden um die Buchungen der letzte 365 Tage zusehen?
Einfach wie folgt anpassen:
([System.DateTime]::Now.AddDays(-365), [System.DateTime]::Now)
Hallo,
ich würde gerne die Raumbuchungen bei einem Exchange Server 2016 abrufen, funktioniert das Skript auch dafür?
Wenn ja, welche Version muss ich statt „Exchange2010_SP2“ angeben oder welche Änderungen wären noch erforderlich?
Viele Grüße,
Cedric
Ich musste nur folgende Zeilen anpassen:
$EWSPath = „C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll“
$version = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016
Hallo,
kann man nicht auch einfach als „Besprechungsraum@frankysweb.de“ verbinden, statt Impersonationsrechte zu nutzen?
Hallo,
Raumpostfächer erlauben in der Standardkonfiguration keine Anmeldung, da der dazugehörige Benutzer deaktiviert ist. Auch wenn man innerhalb eines Script mehrere Kalender abfragen will, ist es einfacher mit Impersonation zu arbeiten, anstatt viele Kennwörter und Benutzernamen zu hinterlegen.
Gruß,
Frank