Fragensteller
EWS Fehler - Informationspeicher nicht gefunden

Frage
-
Guten Tag
Ich habe ein Script welches mit der EWS Schnittstelle Kalendereinträge in diverse mailbox kalender erstellen soll. leider bekomme ich bei diverse Benutzer immer folgender Fehler:
Ausnahme beim Aufrufen von "Bind" mit 2 Argument(en): "Der angegebene Ordner wurde im Informationsspeicher nicht gefun den." Bei C:\Users\administrator.XXX\Desktop\insertCalendar2.ps1:63 Zeichen:78 + $calendarFolder = [Microsoft.Exchange.WebServices.Data.CalendarFolder]::Bind <<<< ($service, $calendarFolderId) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException
Ich habe auf alle Mailboxen folgende Berechtigung angewant:
$usersWithMailbox = Get-User -OrganizationalUnit "OU=Benutzer,OU=Benutzer,OU=XXXXX,DC=XXXX,DC=LOCAL" -ResultSize Unlimited | Select-Object sAMAccountName,userPrincipalName,RecipientType ForEach ($uwm in $usersWithMailbox){ If ($uwm.RecipientType -eq "UserMailbox"){ Add-MailboxPermission -Identity $uwm.userPrincipalName -User administrator@XX.ch -AccessRights FullAccess | Out-File ".\addedFAP.txt" -Append Set-MailboxFolderPermission -Identity $uwm.userPrincipalName:\Calendar -User administrator@XX.ch -AccessRights Owner | Out-File ".\addedFAP.txt" -Append Set-MailboxFolderPermission -Identity $uwm.userPrincipalName:\Kalender -User administrator@XX.ch -AccessRights Owner | Out-File ".\addedFAP.txt" -Append Set-MailboxFolderPermission -Identity $uwm.userPrincipalName -User administrator@XX.ch -AccessRights Owner | Out-File ".\addedFAP.txt" -Append } }
folgend das Script mit dem ich die Kalender Einträge erstellen möchte:
# Initialize Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" $sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value $user = [ADSI]"LDAP://<SID=$sid>" $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList ([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2) $service.AutodiscoverUrl($user.Properties.mail) # All aclendar events $events = @( ('01.01.2018', 'Neujahr', 'OOF') ) # Getting all Mailboxes $mailBoxes = Get-Mailbox -OrganizationalUnit "OU=Benutzer,OU=Benutzer,OU=XXXX,DC=XXX,DC=LOCAL" -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress ForEach ($m in $mailBoxes){ ('#####################################################################') | Out-File ".\kalendereintraege.txt" -Append ($m.DisplayName + " | " + $m.PrimarySmtpAddress) | Out-File ".\kalendereintraege.txt" -Append ('---------------------------------------------------------------------------') | Out-File ".\kalendereintraege.txt" -Append # Get Calendar entry from each user $calendarFolderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,[string]$m.PrimarySmtpAddress) $calendarFolder = [Microsoft.Exchange.WebServices.Data.CalendarFolder]::Bind($service, $calendarFolderId) $calendarView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView("12/31/2018","1/5/2019") $calendarView.MaxItemsReturned = 20000; $calendarView.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $userCalendarEntrysResult = $calendarFolder.FindAppointments($calendarView) $userCalendarEntrysResult | Format-Table Start, End, LegacyFreeBusyStatus, Subject, IsAllDayEvent $ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId -ArgumentList ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress), $m.PrimarySmtpAddress $service.ImpersonatedUserId = $ImpersonatedUserId # ADD Item ForEach ($e in $events) { if (-Not ($userCalendarEntrysResult | ? {$_.Subject -like $e[1]})) { # For allDayEvent Start and End need to be 24 apart $start = (Get-Date $e[0]) $end = $start.addhours(24) # Calendar event / More properties https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.appointment_properties%28v=exchg.80%29.aspx $appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment -ArgumentList $service $appointment.Subject = $e[1] $appointment.Body = '' $appointment.Start = $start $appointment.End = $end $appointment.IsAllDayEvent = $True $appointment.LegacyFreeBusyStatus = $e[2] $appointment.IsReminderSet = $False $appointment.Location = '' #$appointment.Categories.Add('Frei') #$appointment.RequiredAttendees.Add('sitzungszimmer@xxxx.ch') #$appointment.Save([Microsoft.Exchange.WebServices.Data.SendInvitationsMode]::SendToAllAndSaveCopy) ("+ Erstellt | " + $e[1]) | Out-File ".\kalendereintraege.txt" -Append } else { ("! Vorhanden | " + $e[1]) | Out-File ".\kalendereintraege.txt" -Append } } }
hat mir jemand ein tipp wie ich vorgehen soll? Ich bin am Ende meiner Nerven -.-
- Bearbeitet Edocsyl Freitag, 2. Dezember 2016 16:40 remove company name
Alle Antworten
-
Moin,
sorry, heute schon zu spät, um das zu analysieren, aber eins vorweg:
Wenn Dein Adminkonto die ApplicationImpersonation-Rolle hat und Du Impersonation verwendest, braucht es keine expliziten Rechte an den Kalendern, denn es agiert dann ja als der Besitzer selbst. Die Impersonation muss vor dem Bind stehen.
Aus diesem Grund musst Du aber wiederum $service.AutodiscoverURL für jedes Postfach ausführen, denn es kann ja von Postfach zu Postfach differieren.
Wenn Du zu einem Well Known Folder bindest, musst Du nicht erst die FolderID eruieren, Bind kann auch mit Folder aufgerufen werden: https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.folder.bind(v=exchg.80).aspx
Beim Konstruktor für den Ordner musst Du ein Mailbox-Objekt und nicht die SMTP-Adresse übergeben: https://msdn.microsoft.com/en-us/library/dd634902(v=exchg.80).aspx . Du musst also das Objekt initialisieren: https://msdn.microsoft.com/en-us/library/dd635717(v=exchg.80).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 Aber wie gesagt, mit Impersonation brauchst Du es nicht, denn Du greifst nicht als "ADMIN" auf den Kalender von "USER" zu, sondern Du greifst als "USER, impersonated by ADMIN" auf Deinen eigenen Kalender zu.
Vielleicht hilft's ja was und bringt Dich weiter...
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Als Antwort vorgeschlagen NobbyausHBModerator Montag, 5. Dezember 2016 09:23