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
- Best practices when using the Outlook Calendar
- Description of common scenarios in which Calendar information may be removed from the Calendar or may be inaccurate
- Recommendations for configuring delegate scenarios in outlook 2010
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
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
You will find the output in the folder I specified
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
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
and here the CSV imported into Excel
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?
- You need to have Microsoft Exchange Web Services (EWS) installed
-
You should have the role ApplicationImpersonation or you will need FullAccess on the mailboxes you want to scan
-
The script could be downloaded here
- Description of available parameters can be found here
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
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
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
let’s have a look at the ModifiedOccurrences
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
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
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
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:
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.
Thank you for taking the time to write the script and share it. It was very helpful.
LikeLike
Hi Alexander,
I’m glad the script helped you!
Ciao,
Ingo
LikeLike
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!
LikeLike
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
LikeLike
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.
LikeLike
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 ?
LikeLike
Problem solved – I had EWS set to Disabled on service Account – I have to run this command:
Set-CASMailbox ServiceAccountName -EwsEnabled $true
LikeLike
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
LikeLike
This looks very promising, what a heap of information, thank you very much for writing this!
LikeLiked by 1 person
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
LikeLike
Hi Fuzailov,
what parameter did you use? Could you share the command by replacing the e-mail address?
Ciao,
Ingo
LikeLike
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
LikeLike
Hi Fuzailov, thanks for the update. Always something new! Ciao,
Ingo
LikeLike
Pingback: PowerShell and bit field attributes | The clueless guy
Pingback: History of a calendar item | The clueless guy
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?
LikeLike
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
LikeLike
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
LikeLike
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
LikeLike
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.
LikeLike
and what do you get on the machine running the following command:
[System.TimeZoneInfo]::GetSystemTimeZones() | ? displayname -Match dublin
LikeLike
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
LikeLike
That’s the reason why it failes to calculate the time. Interesting part is that I cannot reproduce this on any of my boxes.
LikeLike
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?
LikeLike
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?
LikeLike
Yes, the machine (running Server 2012 R2) was set to en-GB before Exchange was installed.
LikeLike
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
LikeLike
Pingback: How to hunt down an EAS bug | The clueless guy
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?
LikeLike
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?
LikeLike
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.
LikeLike
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.
LikeLike
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.
LikeLike
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
LikeLike
Hi Ralph,
which PowerShell version are you running? I think it’s because the function ConvertFrom-ClientIntent as it says in row 236.
Ciao,
Ingo
LikeLike
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
LikeLike
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
LikeLike
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
LikeLike
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
LikeLike
Pingback: Outlook: Issue with modified occurences in a series | The clueless guy
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.
LikeLike
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
LikeLike
Hi, just to clarify: You want to have the LastModifiedTime and DateTimeCreated as it is and not converted to UTC, which is currently forcibly done by the script?
LikeLike
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
LikeLike
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?
LikeLike
Pingback: Advanced troubleshooting calendar items | The clueless guy
Yes that is what I want
LikeLike
Hi Clayman, I’ve updated the script. You can download the new version and use the switch UseLocalTime.
LikeLike
Reblogged this on Konkretor Blog, IT Stuff and more.
LikeLike
Will this work for O365 in Hybrid mode
LikeLike
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
LikeLike
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?
LikeLike
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
LikeLike
Pingback: Get-AutoDV2 | The clueless guy
This looks great, but I’m not able to get it working with O365. It see from your comments that you’re working on a newer version. Hopefully we can play with it soon!
LikeLike
Hi Alex,
is this related to authentication issue or the correct endpoint couldn’t be found?
Ciao,
Ingo
LikeLike
Pingback: New model calendar sharing and excessive logging | The clueless guy
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?
LikeLike
Hi,
you can opt-out of REST based calendaring by unchecking “Turn on shared calendar improvements” in your Outlook profile. Check the article here:
https://support.microsoft.com/en-au/office/how-to-enable-and-disable-the-outlook-calendar-sharing-updates-c3aec5d3-55ce-4cea-84b0-80aab6d8dc26
If you don’t see it you need to turn it on and re-add the calendars.
Ciao,
Ingo
LikeLike