Troubleshooting calendar items

In the past few month the number of incoming request related to calendar issues increased. There are several reasons for this like message body truncation, Richt text or HTML formated messages get converted to plain text. Those are most likely related to iOS devices and there is a KB available for this here.

But not only iOS is causing issues. Especially when it comes to delegate scenarios with more than one delegate and when all of them have multiple clients with different versions (e.g.: Outlook 2010/2013, Outlook for Mac and a whole bunch of mobile devices).

To get to a point: Just ignored the following recommendations

But how do you troubleshoot those issues? There are several techniques and I will cover some of them in this post:

Update 26.05.2015

Update 09.06.2016

Update 06.11.2017

In this update I fixed a bug, which caused the script to loop, when more than 1000 items were found. I also improved the performance by using ConvertIds rather than ConvertId method. With this only one EWS call for all items instead one for each is made.

Just have a look at the section for the script here.

Update 07.01.2019

What you are looking for

When you start analysing calendar items it all comes down to a few properties of those items, which helps you to find the what, who, when and which client. The following list is the attributes (at least I’m using for analysis):

Property

Description

PidTagLastModificationTime The time the item was last modified.
PidTagLastModifierName The user who modified the item.
PidLidCleanGlobalObjectId The unique GOID across multiple mailboxes. This is the most important unique identifier especially for recurrent appointments!
PidLidGlobalObjectId The GOID of an item.
 0x8059001E This extended property records the client, which modified the item.
 0x8054001E This extended property records the last action performed on the item.

Your options:

In Exchange 2013

When you are on Exchange 2013 then you really have the best out-of-the-box options. You can export the diagnostic logs using the CmdLet Get-CalendarDiagnosticLog and take advantage of the CmdLet Get-CalendarDiagnosticAnalysis.

In Exchange 2010

With Exchange 2010 you can get the dignostic logs like in Exchange 2013 with the CmdLet Get-CalendarDiagnosticLog, but you cant take advantage of the CmdLet Get-CalendarDiagnosticAnalysis like in Exchange 2013.

How does it looks like?

You can always use MFCMAPI to examine the properties. Here is an example how it looks like when you open a mailbox and check the properties of an item

CalDiag01

In Exchange 2013 you can use the previous mention CmdLets and create either a HTML report or a CSV file, which could be analysed in Excel or your favorite tool.

Example #1

In this example I’m analyzing an appointment with the subject “Troubleshoot calendaritems 01”:

Get-CalendarDiagnosticLog -Identity ingogege -Subject 'Troubleshoot calendaritems 01' -LogLocation C:\Temp

CalDiag02

You will find the output in the folder I specified

CalDiag03

Now use Get-CalendarDiagnosticAnalysis and analyse the gathered log

Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Ingo Gegenwarth' -DetailLevel Advanced >C:\Temp\CalDiag01.csv

in this case we have a CSV file as output, which looks like this

Import-Csv C:\Temp\CalDiag01.csv | Out-GridView

CalDiag04

Well, okay this one doesn’t look really interesting as not much happened. But this was just a simple example. Let’s see how it looks in the second one.

Example #2

In this example we have a manager/delegate scenario. Mickey is the delegate of Ingo and setup a meeting series with Han.

First step is to extract the calendar items from all involved mailboxes

Get-CalendarDiagnosticLog -Identity ingogege -Subject 'Troubleshoot calendaritems 02' -LogLocation C:\Temp
Get-CalendarDiagnosticLog -Identity mickeygege -Subject 'Troubleshoot calendaritems 02' -LogLocation C:\Temp
Get-CalendarDiagnosticLog -Identity hansolo -Subject 'Troubleshoot calendaritems 02' -LogLocation C:\Temp

In the next step let Exchange analyse the items and create a HTML report

Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Ingo Gegenwarth' -DetailLevel Advanced -OutputAs HTML >C:\Temp\ingo.html
Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Mickey Gegenwarth' -DetailLevel Advanced -OutputAs HTML >C:\Temp\mickey.html
Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Han Solo' -DetailLevel Advanced -OutputAs HTML >C:\Temp\han.html

Alternatively create a CSV file and open it in Excel

Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Ingo Gegenwarth' -DetailLevel Advanced >C:\Temp\ingo.csv
Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Mickey Gegenwarth' -DetailLevel Advanced >C:\Temp\mickey.csv
Get-CalendarDiagnosticAnalysis -LogLocation 'C:\Temp\Han Solo' -DetailLevel Advanced >C:\Temp\han.csv

As you can see you will get detailed information when, who and which client modified the items and much more for each mailbox

HTML reports

CalDiag05

CalDiag06

CalDiag07

and here the CSV imported into Excel

CalDiag08

CalDiag09

CalDiag10

You really get a full set of information and I recommend to go with the CSV files.

Note: The CmdLet Get-CalendarDiagnosticAnalysis is currently only available within Exchange 2013 on-prem. Neither in Exchange 2010 nor in EXO!

This is really a huge step forward. Nevertheless I run into the issue that I don’t have the CmdLet available to work on all those incoming requests. The only way was to gather the logs and then use MFCMAPI to check each item…..as you can imagine this is very time consuming.

Therefore I wrote a script using EWS, which will get all the details for me:

Get-CalendarItems.ps1

What do you need to run the script?

The script accepts the following parameters:

Parameter

Description

EmailAddress The e-mail address of the mailbox, which will be checked. The script accepts piped objects from Get-Mailbox or Get-Recipient.
Credentials Credentials you want to use. If omitted current user context will be used.
Impersonate Use this switch, when you want to impersonate.
Subject Use a string as a filter to search for. Cannot be combined with CleanGlobalObjectID or GlobalObjectID.
StartDateLastModified Filter for items, which have been modified after this date. The parameter needs to be a type of [datetime]. You can combine this with EndDateLastModified to filter for a range.
EndDateLastModified Filter for items, which have been modified before this date. The parameter needs to be a type of [datetime]. You can combine this with StartDateLastModified to filter for a range.
CleanGlobalObjectID When you know the ID (e.g.: using MFCMAPI), you can search for it. Cannot be combined with Subject or GlobalObjectID.
GlobalObjectID When you know the ID (e.g.: using MFCMAPI), you can search for it. Cannot be combined with Subject or CleanGlobalObjectID.
CalendarOnly By default the script will enumerate all folders. If you want to limit to folders with type “IPF.Appointment” use this switch.
Server By default the script tries to retrieve the EWS endpoint via Autodiscover. If you want to run the script against a specific server or endpoint, just provide the name in this parameter. Not the URL!
AllFolders By this all folders under MsgRootFolder will be searched
AllItemProps All properties of an item will be returned
SortByDateTimeCreated The output will be sort by DateTimeCreated
DestinationID If you ant to have the ItemId converted provide the destination format. Valid formats are “EwsLegacyId”, “EwsId”, “EntryId”, “HexEntryId”, “StoreId”, “OwaId” based on https://msdn.microsoft.com/library/microsoft.exchange.webservices.data.idformat(v=exchg.80).aspx
TrustAnySSL Switch to trust any certificate.
DateFormat By default the script enumerates the current culture and the datetime format. It will then append the milliseconds to it. If you want to specify your own format (e.g.:’yyyyMMdd hhmmssfff’) use this.
WebServicesDLL Path to the DLL
StartDate Filter by Start date of a single appointment. Note: Cannot be used to find recurring meetings!
EndDate Filter by End date of a single appointment. Note: Cannot be used to find recurring meetings!
StartDateTimeCreated When filter by Datetimecreated, all items created after this date are returned.
EndDateTimeCreated When filter by Datetimecreated, all items created before this date are returned.
UseLocalTime When this switch is used, DateTimeCreated and LastModifiedTime is converted to local time of the machine where the script is running on.

By default the script is searching the following folders:

  • all folders with the folderclass “IPF.Appointment”
  • WellKnownFolders: Inbox,SentItems,RecoverableItemsRoot
  • all subfolders under the WellKnownFolder RecoverableItemsRoot except “Audits”

If you use the switch -CalendarOnly only the folders with the folderclass  “IPF.Appointment” will be searched.

When you select -AllFolders, the script will extend the default selection and search all found folders under MsgFolderRoot.

How it looks in action?

I take the second example. We have 3 people involved: Ingo, Mickey and Han.

First put their primary SMTP addresses into an array

[array]$mbs = "ingogege@adatum.com","mickeygege@adatum.com","hansolo@adatum.com"

Then search those mailboxes for items with the string ‘calendaritems 02’ in the subject

$basic=.\Get-CalendarItems.ps1 -EmailAddress $mbs -Impersonate -Subject 'calendaritems 02'

now you can look at all the versions in all the mailboxes what exactly happened

CalDiag11

as you can see you will get from all mailboxes the data into one single file in order of what happened. Several clients e.g.: OWA, ActiveSync were involved. But you can even more data. Now I’m searching for the PidCleanGlobalObjectID and use also the switch -AllItemProps

$enhanced= .\Get-CalendarItems.ps1 -EmailAddress $mbs -Impersonate -CleanGlobalObjectID 040000008200E00074C5B7101A82E00800000000F0838A8F1882D001000000000000000010000000099DC0EA675D1A4CA9BB87AF552001AB -AllItemProps

The script will now gather almost all properties of the items

CalDiag12

as the script adds the items itself as an object to the output you can examine all the properties. Take item number 8 from the result

CalDiag13

let’s have a look at the ModifiedOccurrences

CalDiag14

the occurrence on the 6/26/2015 was changed from starting time 10:00 AM to 07:00 PM and looking at the following screenshot you see that this change was sent by the user Ingo Gegenwarth using Outlook (Client=MSExchangeRPC) at 08:18:01.529 AM

CalDiag15

I know this is not easy to read. Here is another example.

Real life example

A user complaint that he had a wrong date in his calendar than the organizer. The organizer had the 13.04.2015 in his calendar, while the attendee had the 15.04.2015. I extracted all the items from their mailboxes and started analyzing it in Excel. I marked organizers items yellow 

CalDiag16

so as I used the switch -AllItemProps, I have the items itself as an object. I also piped the result into a variable $organizer and now I can easily compare what the difference is of the property ModifiedOccurrences

CalDiag17

as you can see the ActiveSync client reverted the change and caused the discrepancy between the organizer and attendee.

Conclusion

When it comes to a support case you will use the build-in CmdLets mentioned above. If you want to analyze some issues by yourself, I would use the script as it gives you a better overview and it’s order by time. The script has also some disadvantages as you will need to have special permissions and EWS Api installed. But it also has some advantages as you can really extract almost all properties (e.g.: body of an item), which the CmdLets don’t do.

Happy analyzing!

Update 26.05.2015:

I was approached by a few colleagues and other peoples, which used the script to troubleshoot some calendar issues. The issue they were facing was that they couldn’t get any entry for the client or for the action, which was performed on the item.

In all cases the property CalendarVersionStoreDisabled of those mailboxes was set to $True. In order to get those extende MAPI properties written and to get the different versions of the item logged you need to make sure that this value is set to $False, which is the default.

From my experience with the last cases of calendar item issues I also change the script as follows:

  • I predefined the parameter DateFormat with the value “yyyyMMdd HHmmssfff” in order to have a better sorting in e.g.:Excel
  • When you use the switch AllItemProps now the script reports all ModifiedOccurences and DeletedOccurrences, which makes it easier to troubleshoot recurrent meetings

Update 09.06.2016:

Initial the script did not include a few IPM item classes in the search in order to have a better overview. Now those are included:

  • IPM.Schedule.Meeting.Canceled
  • IPM.Schedule.Meeting.Request
  • IPM.Schedule.Meeting.Resp.Neg
  • IPM.Schedule.Meeting.Resp.Pos
  • IPM.Schedule.Meeting.Resp.Tent

Besides this the property Appointment.Recurrence is now converted in a string and available in the output, when the switch is used AllItemProps:

CalDiag18.PNG

This is a result of an increasing number of reported issues of meeting cancellation.

Update 07.01.2019:

There is a major update for the script. I’ve added support for OAuth authentication and the ability of searching for either multiple Subjects, CleanGlobalObjectIDs or GlobalObjectID at one time. Also a view additional properties related to meeting series e.g.: PidLidMeetingType, PidLidOldWhenStartWhole, PidLidOldWhenEndWhole and attendee list.

59 thoughts on “Troubleshooting calendar items

  1. Thanks for the great EWS script. This will be really useful as we use Office 365-Dedicated service with Exchange 2010 and it seems that we cannot use the Get-CalendarDiagnosticLog cmdlet – at least it never works for us. We have to contact Microsoft Support Online each time and ask them to run the cmdlet to extract the logs – I guess because our only admin access is via Remote PowerShell into the Office 365 Exchange servers. Can you explain what exactly the script is doing? Is it extracting the diagnostic logs directly from the mailbox (I see there’s a “Calendar Logging” folder in the Recoverable Items folder in MFCMAPI), e.g. it is an alternative to the official cmdlet? Also I wonder if you have seen an issue that we are now experiencing almost on a weekly basis with our Managers and Delegates… Suddenly the meeting event created by the delegate disappears from the manager’s calendar, but it is still visible in the invitees’ calendars. When we investigate via MFCMAPI we find that the item is still in the Calendar folder but somehow the ItemClass has changed from “IPM.Appointment” to “IPM.Note” and this stops the item from displaying in the calendar properly. If we change the item class back to “IPM.Appointment” using MFCMAPI it generally fixes the issue. Just wondered if you have any thoughts on this? We are getting more and more of these issues but we cannot reproduce it and we cannot find any reason for it. Some users have mobile devices and some don’t. The only common thread is that it’s always a manager/delegate scenario. We have opened multiple tickets with Microsoft and they have not been able to identify the issue. Thanks!

    Like

    • Hi Stuart,
      as described above the script searches by default the following folders:
      ◾all folders with the folderclass “IPF.Appointment”
      ◾WellKnownFolders: Inbox,SentItems,RecoverableItemsRoot
      ◾all subfolders under the WellKnownFolder RecoverableItemsRoot except “Audits
      Unless you are using the switch “AllFolders”. In general only items with the class IPM.Appointment are searched.
      You can add additional filters like DateTime, Subject and GOID.
      In the end it works very similar like the native Exchange CmdLet, but uses EWS to retrieve the MAPI properties. And when you are using the switch “AllItemProps” you get also the whole item as object back. Here you can also examine the body for instance(just in case a mobile device truncated it!).
      As the script filters for the IPM.Appointment class it won’t detect the issue you are facing. Before you fix the item have a look at the MAPI property 0x8059001E, which tells you the client. Maybe this gives you a hint.
      In general I’m seeing a lot of mobile devices are changing appointments, especially recurrent once.
      I hope this helps!
      Ciao,
      Ingo

      Like

  2. Thanks for the detailed info and suggestions Ingo. We’ll certainly take a look at MAPI property 0x8059001E next time we’re see an IPM.Appointment change to IPM.Note. Thanks again.

    Like

  3. Hi,

    I’m a mamber of “Organization Management” RBAC group, so I should have rights to impersonate all mailboxes, and I’ve addeed Full Access rights to one test mailbox, but I get this error when try to run your script:

    Exception calling “FindFolders” with “3” argument(s): “The account does not have permission to impersonate the requested user.”

    Any ideas ?

    Like

    • Problem solved – I had EWS set to Disabled on service Account – I have to run this command:
      Set-CASMailbox ServiceAccountName -EwsEnabled $true

      Like

      • Hi Lazy,
        glad you solved the issue. Nevertheless you need to assign an account the permission to impersonate. This is not the case by default. The other option is to have full mailbox access to the mailboxes you want to access.
        Ciao,
        Ingo

        Like

  4. Hello
    error:
    Обнаружено несколько неоднозначных перегрузок для “ExchangeService”, число аргументов: “1”.
    (It was found a few ambiguous overloads for “ExchangeService” number of arguments: “1”.)

    Ex 2013 cu12 win 2012r2 rus

    What can I do?
    Thank you

    Like

      • Hello 🙂
        its because i install EWS Managed API 1.2 (This script requires the EWS Managed API 1.2 or later.
        Please download and install the current version of the EWS Managed API from)

        after that I install api 2.0 but not restart posh and get this error.

        Today I restart posh and script works fine.

        grazie
        Ciao,
        Fuzailov

        Like

  5. Pingback: PowerShell and bit field attributes | The clueless guy

  6. Pingback: History of a calendar item | The clueless guy

  7. Hi. I’m trying to use your script to generate a report on calendar items that have been edited in the last day, on an Exchange 2013 CU14 server using EWS API v2.
    I can get it to successfully report edited items, but it does not always include a Start or End time for all events – some have them, some are null.
    Do you know why that might happen?

    Like

    • Hi Andy,
      could you try to run the script with the switch “-Verbose” and see if you see errors like “Could not calculate time from extended properties!”. Besides this I’m curious about your culture (get-culture).
      Ciao,
      Ingo

      Like

      • Thanks for responding so quickly!

        Get-Culture returns “LCID 2057, en-GB, English (United Kingdom)”, which is what I’d want it to be.

        For a query returning three results, two showing Start and End and one not, -Verbose output returns:

        VERBOSE: Both properties exist. Will caculate start time…
        VERBOSE: Could not calculate time from extended properties!
        VERBOSE: Both properties exist. Will caculate end time…
        VERBOSE: Could not calculate time from extended properties!
        VERBOSE: Bit mask:0
        VERBOSE: Both properties exist. Will caculate start time…
        VERBOSE: Both properties exist. Will caculate end time…
        VERBOSE: Bit mask:0
        VERBOSE: Both properties exist. Will caculate start time…
        VERBOSE: Both properties exist. Will caculate end time…
        VERBOSE: Bit mask:0

        Like

      • The script is trying to calculate the Start and End time based on 2 properties. One is the TimeZone and I think that on the failing one the TimeZone was set on the client with an unknown string. What is returned for the TimeZone? You need to run the script with “-AllItemProps”.
        Ciao,
        Ingo

        Like

      • The TimeZone property for the events that work is:
        “(UTC) Dublin, Edinburgh, Lisbon, London”

        The one that does not is:
        “(UTC+00:00) Dublin, Edinburgh, Lisbon, London”

        Looking for differences, the events that work were created on Outlook 2010, while the one that does not is Outlook 2013.

        Like

      • The Exchange server shows this:
        Id : GMT Standard Time
        DisplayName : (UTC) Dublin, Edinburgh, Lisbon, London
        StandardName : GMT Standard Time
        DaylightName : GMT Daylight Time
        BaseUtcOffset : 00:00:00
        SupportsDaylightSavingTime : True

        Like

      • Increasing the date range I’m searching doesn’t help clarify things, either.
        I’ve found events made by the same user on the same PC on the same day that differ in which Timezone string they use. I’ve tested available 2010/2013 clients and found no patterns, so I can’t even suggest it’s a quirk with a specific version of Outlook, either.

        The difference appears to comes as the event is created: editing an event with the correct timezone maintains the correct timezone. Editing an event with the incorrect timezone maintains the incorrect timezone.

        It doesn’t help solve the problem, but at least now I know I need to modify the ConvertUTCTimeToTimeZone function to alter the UTC+00:00 timezone and get it working for my needs.

        Is there anything else you might like me to check for you, in case someone else comes across the same issue?

        Like

      • Appreciate your help. I’m currently installing on a new box CU14. I’m not sure why the display names for the timezone are different. Did you install Exchange on an OS with localization en-GB?

        Like

      • found a machine in my landscape, which was outdated in terms of Windows Updates. After installing the latest updates the timetone now also shows (UTC+00:00). I couldn’t figure out, which update it was.
        Ciao,
        Ingo

        Like

  8. Pingback: How to hunt down an EAS bug | The clueless guy

  9. Hi Ingo, thanks for posting this script, but I have a request I’d like to get it to output only those Calendar Items (“IPF.Appointment”) where the Start date is ‘Today.’ Can you point me in the right direction?

    Like

    • Hi Greg, you want to filter based on the Start date? Why? You can filter on modify date, which makes sense, but I don’t see a scenario where you want to filter on Start date. Could you share more details about this?

      Like

      • Ingo,

        We’re a non-profit social services organization with about 24 Counselors and 12 Session Rooms. The rooms have Resource Calendars. The Subject of each event in the Rooms is the name of the client. We’d like to print a list of all the Subjects (Names) for all the Rooms so our Receptionist knows they are expected and can buzz them thru security. Right now she compiles a list by hand and pastes them into an Excel worksheet.

        Like

      • Hi Greg, I played around with this. So far I couldn’t find a way to filter like that. The problem is that the client is in charge of representing you the item in your calendar. Think about recurrent meetings. Sure there is the property Start and End, but in a serie this doesn’t match the actual day. I’m still trying to find a way…will update you.

        Like

      • Thanks for this. I could settle for filtering the objects where Start == “Today”. It is envisioned that we will run this every workday, so no worries about recurring meetings. Besides, the schedules themselves are very fluid and can change a lot, esp with Counselors calling out sick or clients cancelling appointments.

        Like

  10. Hi Ingo,
    I’m trying to troubleshoot an issue with some Exchange 2010 calendars. I’ve been able to use your script to get the basic details, but when I try to gather the enhanced details, I get the following error.

    The value I used for CleanGlobalObjectID was taken from the basic details

    [PS] C:\scripts>.\Get-CalendarItems.ps1 -EmailAddress $mbs -CleanGlobalObjectID 040000008200E00074C5B7101A82E0080000000050E62EE8276BD20100000000000000
    001000000026A212BDD88C8243888EAA1247070B46 -AllItemProps

    CategoryInfo : InvalidOperation: (Alias:Token) [], RuntimeException
    ErrorDetails :
    Exception : System.Management.Automation.RuntimeException: Cannot find an appropriate constructor to instantiate the custom attribute obj
    ect for type ‘Alias’.
    at System.Management.Automation.AttributeNode.GetCustomAttributeObject()
    at System.Management.Automation.AttributeNode.GetCustomAttribute()
    at System.Management.Automation.ScriptBlock.InitializeAttributesAndParameters()
    at System.Management.Automation.ScriptBlock.get_UsesCmdletBinding()
    at System.Management.Automation.CommandDiscovery.GetScriptAsCmdletProcessor(IScriptCommandInfo scriptCommandInfo, Executio
    nContext context, Boolean useNewScope, Boolean fromScriptFile)
    at System.Management.Automation.CommandDiscovery.CreateCommandProcessorForScript(FunctionInfo functionInfo, ExecutionConte
    xt context, Boolean useNewScope)
    at System.Management.Automation.CommandDiscovery.LookupCommandProcessor(CommandInfo commandInfo, CommandOrigin commandOrig
    in, Nullable`1 useLocalScope)
    at System.Management.Automation.CommandDiscovery.LookupCommandProcessor(String commandName, CommandOrigin commandOrigin, N
    ullable`1 useLocalScope)
    at System.Management.Automation.ExecutionContext.CreateCommand(String command)
    at System.Management.Automation.CommandNode.CreateCommandProcessor(Int32& index, ExecutionContext context)
    at System.Management.Automation.CommandNode.AddToPipeline(PipelineProcessor pipeline, ExecutionContext context)
    at System.Management.Automation.PipelineNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext
    context)
    at System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputPipe,
    ArrayList& resultList, ExecutionContext context)
    FullyQualifiedErrorId : CannotFindConstructorForCustomAttribute
    InvocationInfo :
    At C:\scripts\Get-CalendarItems.ps1:236 char:15
    + [Alias <<<< ()]
    PipelineIterationInfo :
    TargetObject : Alias

    Regards
    Ralph

    Like

  11. Hi Ingo,

    Nice site you have here with some good information. Thanks for taking the time to explaining it for the rest of us 🙂

    I’ve been trying to use Get-CalendarDiagnosticlog and Get-CalendarDiagonsticAnalysis to troubleshoot a problem.

    I connect to my exchange server with PSsession. Like so:

    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri EXCHANGE SERVER NAME
    Import-PSSession $Session

    Then when I run these two:

    Get-CalendarDiagnosticLog -Identity USERNAME -Subject “SUBJECT” -LogLocation “TEMP” -Latest

    and

    Get-CalendarDiagnosticAnalysis -LogLocation “LOGLOCATION ON EX SERVER” -DetailLevel Advanced > TEMP.CSV

    on a specific meeting that I want to troubleshoot. I get only the headers with no content. If I do it an another meeting it gives me all the information.
    This is done on the same user.

    I’ve also tried running it on the exchange management shell and got the same result.

    Any idea why I am getting “empty” logs on this one meeting?

    Best Regards,
    Dino

    Like

    • Hi Dino, no idea. Have you tried my script? Just to see if there is a difference. Alternative I would check the items with MFCMAPI. You can open them and see if the properties are really not there or the item is corrupt.
      Ciao,
      Ingo

      Like

  12. Hi Ingo,
    I use your script and everything works great.
    I have one question.
    Can also read calendar entries 30 days in the future?
    Best Regards,
    Joe

    Like

    • Hi Joe,
      the script will return all objects, which matches the filter. Doesn’t matter how far in the future or in back in time. As long as it matches the items will be returned.
      Ciao,
      Ingo

      Like

  13. Pingback: Outlook: Issue with modified occurences in a series | The clueless guy

  14. I am using your script and I cannot get the UTC time to reflect my time zone or local. What am I doing wrong. I have not changed anything in the script just run from powershell. I love your script by the way wonderful only if I can get the time to reflect est and local time.

    Like

  15. Sorry Let me clarify I am using the Get-CalendarItems.ps1 “Basic and Enhanced” This give me the UTC time and not My local time zone. What do I need to add or remove or modify to the script to reflect my EST local time.
    Thank you in advance

    Like

      • If I could I would like the time to reflect EST time. I would like the reports to reflect the actual time the events happen which would be my local time zone. EST

        Like

      • I think this is something for the next version. An additional parameter, where you define the timezone to get the LastModifiedTime and DateTimeCreated converted. Keep in mind that items across multiple mailboxes can have different timezones. That’s why I decided to reflect UTC. With the additional parameter all timestamps would be converted to the given timezone. Is that what you want?

        Like

  16. Pingback: Advanced troubleshooting calendar items | The clueless guy

    • Hi Chris, it will, but some considerations here: You most likely will need to use the parameter -Server with outlook.office365.com. Also as of now the script supports only BASIC authentication, which might not work for you when MFA kicks in. This depends on your setup. I’m currently working on a version, where you can use OAuth for authentication. It’s not yet public. If you want to look into this just let me know.
      Ciao,
      Ingo

      Like

  17. Hi Igno,
    Very informative post !!

    I want to find declined meetings in last 10 minutes with the required attendees, and who declined the meeting.

    I have an application which creates meetings using service account, for staff members and books a particular room. I would like to know which staff member declined the meeting.
    Is it possible with this script?

    Like

    • Hi Bhusan,
      this should work. You would query the meeting room for the specific meeting. The script also collects the meeting responses. You can see then from each attendee the response (when they responded).
      Ciao,
      Ingo

      Like

  18. Pingback: Get-AutoDV2 | The clueless guy

  19. Pingback: New model calendar sharing and excessive logging | The clueless guy

  20. We are in hybrid and a recently created equipment calendar has standard Properties > Permissions Share features, yet all other Owners see blank. I used another machine today and now I see blank. The good Share view on my original laptop shows a MAPI calendar. All other Owners and my second laptop shows a REST calendar. Do I have to upgrade an Office version or downgrade an EXO calendar? Would this tool help troubleshoot the sharing?

    Like

Leave a comment