diff --git a/Calendar/CalLogHelpers/CalLogCSVFunctions.ps1 b/Calendar/CalLogHelpers/CalLogCSVFunctions.ps1 index 10b10d8e6b..e5e783c382 100644 --- a/Calendar/CalLogHelpers/CalLogCSVFunctions.ps1 +++ b/Calendar/CalLogHelpers/CalLogCSVFunctions.ps1 @@ -131,7 +131,6 @@ function BuildCSV { Write-Host "Starting to Process Calendar Logs..." $GCDOResults = @() - $IsFromSharedCalendar = @() $LogType = @() $script:MailboxList = @{} Write-Host "Creating Map of Mailboxes to CNs..." @@ -157,8 +156,6 @@ function BuildCSV { } } - $IsFromSharedCalendar = ($null -ne $CalLog.externalSharingMasterId -and $CalLog.externalSharingMasterId -ne "NotFound") - # Record one row $GCDOResults += [PSCustomObject]@{ 'LogRow' = $Index @@ -169,7 +166,7 @@ function BuildCSV { 'LogClientInfoString' = $CalLog.LogClientInfoString 'TriggerAction' = $CalLog.CalendarLogTriggerAction 'ItemClass' = $ItemType - 'Seq:Exp:ItemVersion' = $CalLog.AppointmentSequenceNumber.ToString() + ":" + $CalLog.AppointmentLastSequenceNumber.ToString() + ":" + $CalLog.ItemVersion.ToString() + 'Seq:Exp:ItemVersion' = CompressVersionInfo($CalLog) 'Organizer' = $CalLog.From.FriendlyDisplayName 'From' = GetBestFromAddress($CalLog.From) 'FreeBusy' = $CalLog.FreeBusyStatus.ToString() @@ -178,8 +175,6 @@ function BuildCSV { 'LogFolder' = $CalLog.ParentDisplayName 'OriginalLogFolder' = $CalLog.OriginalParentDisplayName 'SharedFolderName' = MapSharedFolder($CalLog.ExternalSharingMasterId) - 'IsFromSharedCalendar' = $IsFromSharedCalendar - 'ExternalSharingMasterId' = $CalLog.ExternalSharingMasterId 'ReceivedBy' = $CalLog.ReceivedBy.SmtpEmailAddress 'ReceivedRepresenting' = $CalLog.ReceivedRepresenting.SmtpEmailAddress 'MeetingRequestType' = $CalLog.MeetingRequestType.ToString() @@ -193,7 +188,7 @@ function BuildCSV { 'RecurrencePattern' = $CalLog.RecurrencePattern 'AppointmentAuxiliaryFlags' = $CalLog.AppointmentAuxiliaryFlags.ToString() 'DisplayAttendeesAll' = $CalLog.DisplayAttendeesAll - 'AttendeeCount' = ($CalLog.DisplayAttendeesAll -split ';').Count + 'AttendeeCount' = GetAttendeeCount($CalLog.DisplayAttendeesAll) 'AppointmentState' = $CalLog.AppointmentState.ToString() 'ResponseType' = $CalLog.ResponseType.ToString() 'ClientIntent' = $CalLog.ClientIntent.ToString() @@ -205,7 +200,6 @@ function BuildCSV { 'SendMeetingMessagesDiagnostics' = $CalLog.SendMeetingMessagesDiagnostics 'AttendeeCollection' = MultiLineFormat($CalLog.AttendeeCollection) 'CalendarLogRequestId' = $CalLog.CalendarLogRequestId.ToString() # Move to front.../ Format in groups??? - 'CleanGlobalObjectId' = $CalLog.CleanGlobalObjectId } } $script:EnhancedCalLogs = $GCDOResults @@ -225,3 +219,38 @@ function ConvertDateTime { } return [DateTime]$DateTime } + +function GetAttendeeCount { + param( + [string] $AttendeeCollection + ) + if ($From.SmtpAddress -ne "NotFound") { + return ($AttendeeCollection -split ';').Count + } else { + return "-" + } +} + +function CompressVersionInfo { + param( + $CalLog + ) + [string] $CompressedString = "" + if ($CalLog.AppointmentSequenceNumber -eq "NotFound" -or [string]::IsNullOrEmpty($CalLog.AppointmentSequenceNumber)) { + $CompressedString = "-:" + } else { + $CompressedString = $CalLog.AppointmentSequenceNumber.ToString() + ":" + } + if ($CalLog.AppointmentLastSequenceNumber -eq "NotFound" -or [string]::IsNullOrEmpty($CalLog.AppointmentLastSequenceNumber)) { + $CompressedString += "-:" + } else { + $CompressedString += $CalLog.AppointmentLastSequenceNumber.ToString() + ":" + } + if ($CalLog.ItemVersion -eq "NotFound" -or [string]::IsNullOrEmpty($CalLog.ItemVersion)) { + $CompressedString += "-" + } else { + $CompressedString += $CalLog.ItemVersion.ToString() + } + + return $CompressedString +} diff --git a/Calendar/CalLogHelpers/CalLogInfoFunctions.ps1 b/Calendar/CalLogHelpers/CalLogInfoFunctions.ps1 index fccfcd6897..33f7eeac95 100644 --- a/Calendar/CalLogHelpers/CalLogInfoFunctions.ps1 +++ b/Calendar/CalLogHelpers/CalLogInfoFunctions.ps1 @@ -116,7 +116,7 @@ function SetLogType { $ShortClientName -eq "CalendarReplication" -or $CalendarItemTypes.($CalLog.ItemClass) -eq "SharingCFM" -or $CalendarItemTypes.($CalLog.ItemClass) -eq "SharingDelete") { - return "Sharing" + return "Sync" } elseif ($ShortClientName -eq "Other EBA" -or $ShortClientName -eq "Other TBA" -or $ShortClientName -eq "LocationProcessor" -or @@ -129,6 +129,7 @@ function SetLogType { return "Exception" } elseif (($CalendarItemTypes.($CalLog.ItemClass) -like "*Resp*" -and $CalLog.CalendarLogTriggerAction -ne "Create" ) -or $CalendarItemTypes.($CalLog.ItemClass) -eq "AttendeeList" -or + ($CalendarItemTypes.($CalLog.ItemClass) -eq "Forward.Notification" -and ($CalLog.CalendarLogTriggerAction -eq "SoftDelete") -or $CalLog.CalendarLogTriggerAction -like "*move*") -or ($CalLog.ItemClass -eq "IPM.Schedule.Meeting.Request" -and $CalLog.CalendarLogTriggerAction -like "*move*" ) ) { return "Cleanup" } else { diff --git a/Calendar/CalLogHelpers/CreateTimelineRow.ps1 b/Calendar/CalLogHelpers/CreateTimelineRow.ps1 index 0df30ef4b9..5ed3a44ffd 100644 --- a/Calendar/CalLogHelpers/CreateTimelineRow.ps1 +++ b/Calendar/CalLogHelpers/CreateTimelineRow.ps1 @@ -97,13 +97,13 @@ function CreateTimelineRow { } else { switch ($CalLog.Client) { ResourceBookingAssistant { - [array] $Output = "ResourceBookingAssistant $($Action) a $($MeetingRespType) Meeting Response message." + [array] $Output = "ResourceBookingAssistant $($Action) a $($MeetingRespType) Meeting Response message$($Extra)." } Transport { - [array] $Output = "[$($CalLog.From)] $($Action) $($MeetingRespType) Meeting Response message." + [array] $Output = "[$($CalLog.From)] $($Action) $($MeetingRespType) Meeting Response message$($Extra)." } default { - [array] $Output = "[$($CalLog.ResponsibleUser)] $($Action) [$($CalLog.Organizer)]'s $($MeetingRespType) Meeting Response with $($CalLog.Client)." + [array] $Output = "[$($CalLog.ResponsibleUser)] $($Action) [$($CalLog.Organizer)]'s $($MeetingRespType) Meeting Response with $($CalLog.Client)$($Extra)." } } } @@ -114,7 +114,7 @@ function CreateTimelineRow { } Exception { if ($CalLog.ResponsibleUser -ne "Calendar Assistant") { - [array] $Output = "[$($CalLog.ResponsibleUser)] $($CalLog.TriggerAction)d Exception to the meeting series with $($CalLog.Client)." + [array] $Output = "[$($CalLog.ResponsibleUser)] $($CalLog.TriggerAction)d Exception starting $($CalLog.StartTime) to the meeting series with $($CalLog.Client)." } } Ipm.Appointment { diff --git a/Calendar/CalLogHelpers/ExcelModuleInstaller.ps1 b/Calendar/CalLogHelpers/ExcelModuleInstaller.ps1 index 3f542ee0c6..b04a2b4495 100644 --- a/Calendar/CalLogHelpers/ExcelModuleInstaller.ps1 +++ b/Calendar/CalLogHelpers/ExcelModuleInstaller.ps1 @@ -34,7 +34,9 @@ function CheckExcelModuleInstalled { # Install ImportExcel module Install-Module -Name ImportExcel -Force -AllowClobber - Write-Host "Done. ImportExcel module is now installed." + Write-Host -ForegroundColor Green "Done. ImportExcel module is now installed." + Write-Host -ForegroundColor Yellow "Please rerun the Script to get your Calendar Logs." + exit } } } diff --git a/Calendar/CalLogHelpers/ExportToExcelFunctions.ps1 b/Calendar/CalLogHelpers/ExportToExcelFunctions.ps1 index b7153135a1..66e566e9c6 100644 --- a/Calendar/CalLogHelpers/ExportToExcelFunctions.ps1 +++ b/Calendar/CalLogHelpers/ExportToExcelFunctions.ps1 @@ -15,6 +15,50 @@ function Export-CalLogExcel { # Export Raw Logs for Developer Analysis Write-Host -ForegroundColor Cyan "Exporting Raw CalLogs to Excel Tab [$($ShortId + "_Raw")]..." $script:GCDO | Export-Excel -Path $FileName -WorksheetName $($ShortId + "_Raw") -AutoFilter -FreezeTopRow -BoldTopRow -MoveToEnd + LogScriptInfo +} + +function LogScriptInfo { + # Only need to run once per script. + if ($null -eq $script:CollectedCmdLine) { + $RunInfo = @() + $RunInfo += [PSCustomObject]@{ + Key = "Script Name" + Value = $($script:command.MyCommand.Name) + } + $RunInfo += [PSCustomObject]@{ + Key ="RunTime" + Value = Get-Date + } + $RunInfo += [PSCustomObject]@{ + Key = "Command Line" + Value = $($script:command.Line) + } + $RunInfo += [PSCustomObject]@{ + Key = "Script Version" + Value = $script:Version + } + $RunInfo += [PSCustomObject]@{ + Key = "User" + Value = whoami.exe + } + $RunInfo += [PSCustomObject]@{ + Key = "PowerShell Version" + Value = $PSVersionTable.PSVersion + } + $RunInfo += [PSCustomObject]@{ + Key = "OS Version" + Value = $(Get-CimInstance -ClassName Win32_OperatingSystem).Version + } + $RunInfo += [PSCustomObject]@{ + Key = "More Info" + Value = "https://learn.microsoft.com/en-us/exchange/troubleshoot/calendars/analyze-calendar-diagnostic-logs" + } + + $RunInfo | Export-Excel -Path $FileName -WorksheetName "Script Info" -MoveToEnd + $script:CollectedCmdLine = $true + } + # If someone runs the script the script again logs will update, but ScriptInfo done not update. Need to add new table for each run. } function Export-TimelineExcel { @@ -62,16 +106,20 @@ $ConditionalFormatting = $( # Client, ShortClientInfoString and LogClientInfoString New-ConditionalText "Outlook" -ConditionalTextColor Green -BackgroundColor $null New-ConditionalText "OWA" -ConditionalTextColor DarkGreen -BackgroundColor $null + New-ConditionalText "Teams" -ConditionalTextColor DarkGreen -BackgroundColor $null New-ConditionalText "Transport" -ConditionalTextColor Blue -BackgroundColor $null New-ConditionalText "Repair" -ConditionalTextColor DarkRed -BackgroundColor LightPink New-ConditionalText "Other ?BA" -ConditionalTextColor Orange -BackgroundColor $null + New-ConditionalText "TimeService" -ConditionalTextColor Orange -BackgroundColor $null New-ConditionalText "Other REST" -ConditionalTextColor DarkRed -BackgroundColor $null + New-ConditionalText "Unknown" -ConditionalTextColor DarkRed -BackgroundColor $null New-ConditionalText "ResourceBookingAssistant" -ConditionalTextColor Blue -BackgroundColor $null - #LogType - New-ConditionalText -Range "C3:C9999" -ConditionalType ContainsText -Text "Ignorable" -ConditionalTextColor DarkRed -BackgroundColor $null - New-ConditionalText -Range "C:C" -ConditionalType ContainsText -Text "Cleanup" -ConditionalTextColor DarkRed -BackgroundColor $null - New-ConditionalText -Range "C:C" -ConditionalType ContainsText -Text "Sharing" -ConditionalTextColor Blue -BackgroundColor $null + #LogType -Would like to Hide "Ignorable" and "Cleanup" rows by default. + New-ConditionalText -Range "C3:C9999" -ConditionalType ContainsText -Text "Ignorable" -ConditionalTextColor Orange -BackgroundColor $null + New-ConditionalText -Range "C:C" -ConditionalType ContainsText -Text "Cleanup" -ConditionalTextColor Orange -BackgroundColor $null + New-ConditionalText -Range "C:C" -ConditionalType ContainsText -Text "Sync" -ConditionalTextColor Blue -BackgroundColor $null + New-ConditionalText -Range "C:C" -ConditionalType ContainsText -Text "Core" -ConditionalTextColor Green -BackgroundColor $null # TriggerAction New-ConditionalText -Range "G:G" -ConditionalType ContainsText -Text "Create" -ConditionalTextColor Green -BackgroundColor $null @@ -89,18 +137,21 @@ $ConditionalFormatting = $( New-ConditionalText -Range "L3:L9999" -ConditionalType ContainsText -Text "Busy" -ConditionalTextColor Green -BackgroundColor $null #Shared Calendar information - New-ConditionalText -Range "Q3:Q9999" -ConditionalType NotEqual -Text "Not Shared" -ConditionalTextColor Blue -BackgroundColor $null - New-ConditionalText -Range "R:R" -ConditionalType ContainsText -Text "TRUE" -ConditionalTextColor Blue -BackgroundColor $null - New-ConditionalText -Range "S:S" -ConditionalType NotEqual -Text "NotFound" -ConditionalTextColor Blue -BackgroundColor $null + New-ConditionalText -Range "Q3:Q9999" -ConditionalType Equal -Text "Not Shared" -ConditionalTextColor Blue -BackgroundColor $null + New-ConditionalText -Range "Q3:Q9999" -ConditionalType Equal -Text "TRUE" -ConditionalTextColor Blue -BackgroundColor Orange #MeetingRequestType - New-ConditionalText -Range "V:V" -ConditionalType ContainsText -Text "Outdated" -ConditionalTextColor DarkRed -BackgroundColor LightPink + New-ConditionalText -Range "T:T" -ConditionalType ContainsText -Text "Outdated" -ConditionalTextColor DarkRed -BackgroundColor LightPink + + #CalendarItemType + New-ConditionalText -Range "AA3:AA9999" -ConditionalType ContainsText -Text "RecurringMaster" -ConditionalTextColor $null -BackgroundColor Plum #AppointmentAuxiliaryFlags - New-ConditionalText -Range "AE3:AE9999" -ConditionalType ContainsText -Text "Copied" -ConditionalTextColor DarkRed -BackgroundColor LightPink + New-ConditionalText -Range "AD3:AD9999" -ConditionalType ContainsText -Text "Copied" -ConditionalTextColor DarkRed -BackgroundColor LightPink + New-ConditionalText -Range "AC3:AC9999" -ConditionalType ContainsText -Text "ForwardedAppointment" -ConditionalTextColor DarkRed -BackgroundColor $null #ResponseType - New-ConditionalText -Range "AI3:AI9999" -ConditionalType ContainsText -Text "Organizer" -ConditionalTextColor Orange -BackgroundColor $null + New-ConditionalText -Range "AG3:AG9999" -ConditionalType ContainsText -Text "Organizer" -ConditionalTextColor Orange -BackgroundColor $null ) function FormatHeader { @@ -116,8 +167,8 @@ function FormatHeader { Set-CellComment -Text "This is the Enhanced Calendar Logs for [$Identity] for MeetingID `n [$($script:GCDO[0].CleanGlobalObjectId)]." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 20 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment center #LogTimestamp Set-CellComment -Text "LogTimestamp: Time when the change was recorded in the CalLogs. This and all Times are in UTC." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 11 -HorizontalAlignment center # LogType - Set-CellComment -Text "LogType: Grouping of logs so ignorable ones can be quickly filtered?" -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet + $sheet.Column(++$n) | Set-ExcelRange -Width 11 -HorizontalAlignment center # LogType + Set-CellComment -Text "LogType: Core logs are what to focus on, to start with, filter all the others out." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # SubjectProperty Set-CellComment -Text "SubjectProperty: The Subject of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # Client @@ -144,21 +195,17 @@ function FormatHeader { Set-CellComment -Text "LogFolder (ParentDisplayName): The Log Folder that the CalLog was in." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 16 -HorizontalAlignment Left # OriginalLogFolder Set-CellComment -Text "OriginalLogFolder (OriginalParentDisplayName): The Original Log Folder that the item was in / delivered to." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 15 -HorizontalAlignment Right # SharedFolderName + $sheet.Column(++$n) | Set-ExcelRange -Width 15 -HorizontalAlignment Left # SharedFolderName Set-CellComment -Text "SharedFolderName: Was this from a Modern Sharing, and if so what Folder." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # IsFromSharedCalendar - Set-CellComment -Text "IsFromSharedCalendar: Is this CalLog from a Modern Sharing relationship?" -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # ExternalSharingMasterId - Set-CellComment -Text "ExternalSharingMasterId: If this is not [NotFound], then it is from a Modern Sharing relationship." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment Left # ReceivedBy Set-CellComment -Text "ReceivedBy: The Receiver of the Calendar Item. Should always be the owner of the Mailbox." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment Left # ReceivedRepresenting Set-CellComment -Text "ReceivedRepresenting: Who the item was Received for, of then the Delegate." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # MeetingRequestType Set-CellComment -Text "MeetingRequestType: The Meeting Request Type of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 20 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment center # StartTime + $sheet.Column(++$n) | Set-ExcelRange -Width 23 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment center # StartTime Set-CellComment -Text "StartTime: The Start Time of the Meeting. This and all Times are in UTC." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 20 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment center # EndTime + $sheet.Column(++$n) | Set-ExcelRange -Width 23 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment center # EndTime Set-CellComment -Text "EndTime: The End Time of the Meeting. This and all Times are in UTC." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 17 -NumberFormat "m/d/yyyy h:mm:ss" -HorizontalAlignment Left # OriginalStartDate Set-CellComment -Text "OriginalStartDate: The Original Start Date of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet @@ -172,13 +219,13 @@ function FormatHeader { Set-CellComment -Text "IsException: Is this an Exception?" -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # RecurrencePattern Set-CellComment -Text "RecurrencePattern: The Recurrence Pattern of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 30 -HorizontalAlignment Center # AppointmentAuxiliaryFlags + $sheet.Column(++$n) | Set-ExcelRange -Width 30 -HorizontalAlignment Center # AppointmentAuxiliaryFlags Set-CellComment -Text "AppointmentAuxiliaryFlags: The Appointment Auxiliary Flags of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 30 -HorizontalAlignment Left # DisplayAttendeesAll Set-CellComment -Text "DisplayAttendeesAll: List of the Attendees of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # AttendeeCount + $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # AttendeeCount Set-CellComment -Text "AttendeeCount: The Attendee Count." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # AppointmentState + $sheet.Column(++$n) | Set-ExcelRange -Width 20 -HorizontalAlignment Left # AppointmentState Set-CellComment -Text "AppointmentState: The Appointment State of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # ResponseType Set-CellComment -Text "ResponseType: The Response Type of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet @@ -194,18 +241,17 @@ function FormatHeader { Set-CellComment -Text "IsAllDayEvent: Is this an All Day Event?" -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet $sheet.Column(++$n) | Set-ExcelRange -Width 10 -HorizontalAlignment center # IsSeriesCancelled Set-CellComment -Text "IsSeriesCancelled: Is this a Series Cancelled Meeting?" -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 30 -HorizontalAlignment Left # SendMeetingMessagesDiagnostics + $sheet.Column(++$n) | Set-ExcelRange -Width 30 -HorizontalAlignment Left # SendMeetingMessagesDiagnostics Set-CellComment -Text "SendMeetingMessagesDiagnostics: Compound Property to describe why meeting was or was not sent to everyone." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 50 -HorizontalAlignment Left # AttendeeCollection + $sheet.Column(++$n) | Set-ExcelRange -Width 50 -HorizontalAlignment Left # AttendeeCollection Set-CellComment -Text "AttendeeCollection: The Attendee Collection of the Meeting, use -TrackingLogs to get values." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 40 -HorizontalAlignment Center # CalendarLogRequestId + $sheet.Column(++$n) | Set-ExcelRange -Width 40 -HorizontalAlignment Center # CalendarLogRequestId Set-CellComment -Text "CalendarLogRequestId: The Calendar Log Request ID of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet - $sheet.Column(++$n) | Set-ExcelRange -Width 120 -HorizontalAlignment Left # CleanGlobalObjectId - Set-CellComment -Text "CleanGlobalObjectId: The Clean Global Object ID of the Meeting." -Row $HeaderRow -ColumnNumber $n -Worksheet $sheet # Update header rows after all the others have been set. # Title Row $sheet.Row(1) | Set-ExcelRange -HorizontalAlignment Left + Set-CellComment -Text "For more information see: https://learn.microsoft.com/en-us/exchange/troubleshoot/calendars/analyze-calendar-diagnostic-logs." -Row 1 -ColumnNumber 1 -Worksheet $sheet # Set the Header row to be bold and left aligned $sheet.Row($HeaderRow) | Set-ExcelRange -Bold -HorizontalAlignment Left diff --git a/Calendar/CalLogHelpers/Invoke-GetCalLogs.ps1 b/Calendar/CalLogHelpers/Invoke-GetCalLogs.ps1 index fdc4843d12..a8e0879612 100644 --- a/Calendar/CalLogHelpers/Invoke-GetCalLogs.ps1 +++ b/Calendar/CalLogHelpers/Invoke-GetCalLogs.ps1 @@ -21,6 +21,7 @@ $script:CustomPropertyNameList = "FreeBusyStatus", "From", "HasAttachment", +"InternetMessageId", "ItemID", "IsAllDayEvent", "IsCancelled", @@ -39,6 +40,10 @@ $script:CustomPropertyNameList = $LogLimit = 2000 +if ($ShortLogs.IsPresent) { + $LogLimit = 500 +} + <# .SYNOPSIS Run Get-CalendarDiagnosticObjects for passed in User with Subject or MeetingID. diff --git a/Calendar/CalLogHelpers/Invoke-GetMailbox.ps1 b/Calendar/CalLogHelpers/Invoke-GetMailbox.ps1 index 92795adf59..4c928e0606 100644 --- a/Calendar/CalLogHelpers/Invoke-GetMailbox.ps1 +++ b/Calendar/CalLogHelpers/Invoke-GetMailbox.ps1 @@ -226,7 +226,7 @@ function GetSMTPAddress { return $PassedCN } else { # We have a problem, we don't have a CN or an SMTP Address - Write-Error "GetSMTPAddress: Passed in Value does not look like a CN or SMTP Address: [$PassedCN]" + Write-Warning "GetSMTPAddress: Passed in Value does not look like a CN or SMTP Address: [$PassedCN]" return $PassedCN } } diff --git a/Calendar/CalLogHelpers/ShortClientNameFunctions.ps1 b/Calendar/CalLogHelpers/ShortClientNameFunctions.ps1 index 9148542442..36ba1d591a 100644 --- a/Calendar/CalLogHelpers/ShortClientNameFunctions.ps1 +++ b/Calendar/CalLogHelpers/ShortClientNameFunctions.ps1 @@ -18,7 +18,7 @@ function FindMatch { $ShortClientNameProcessor = @{ 'Client=Hub Transport' = "Transport" - 'Client=MSExchangeRPC' = "Outlook : Desktop : MAPI" + 'Client=MSExchangeRPC' = "Outlook:Desktop:MAPI" 'OneOutlook' = "NewOutlook" 'Lync for Mac' = "LyncMac" 'MicrosoftNinja' = "Teams" @@ -119,6 +119,8 @@ function CreateShortClientName { $LogClientInfoString -like "*43375d74-c6a5-4d4e-a0a3-de139860ea75*" -or $LogClientInfoString -like "*af9fc99a-5ae5-46e1-bbd7-fa25088e16c9*") { $ShortClientName = "ELC-B2" + } elseif ($LogClientInfoString -like "*AppId=de8bc8b5-d9f9-48b1-a8ad-b748da725064*") { + $ShortClientName = "GraphExplorer" } elseif ($LogClientInfoString -like "*Outlook-iOS*") { $ShortClientName = "OutlookiOS" } elseif ($LogClientInfoString -like "*Outlook-Android*") { diff --git a/Calendar/CalLogHelpers/TimelineFunctions.ps1 b/Calendar/CalLogHelpers/TimelineFunctions.ps1 index aa40f1f67a..7a33eefc74 100644 --- a/Calendar/CalLogHelpers/TimelineFunctions.ps1 +++ b/Calendar/CalLogHelpers/TimelineFunctions.ps1 @@ -67,7 +67,7 @@ function BuildTimeline { FindOrganizer($script:FirstLog) # Ignorable and items from Shared Calendars are not included in the TimeLine. - [array]$InterestingCalLogs = $script:EnhancedCalLogs | Where-Object { $_.LogType -eq "Core" -and $_.IsFromSharedCalendar -eq $False } + [array]$InterestingCalLogs = $script:EnhancedCalLogs | Where-Object { $_.LogType -eq "Core" -and $_.SharedFolderName -eq "Not Shared" } if ($InterestingCalLogs.count -eq 0) { Write-Host "All CalLogs are Ignorable, nothing to create a timeline with, displaying initial values." @@ -81,6 +81,8 @@ function BuildTimeline { } Write-DashLineBoxColor " TimeLine for: [$Identity]", + "CollectionDate: $($(Get-Date).ToString("yyyy-MM-dd HH:mm:ss"))", + "ScriptVersion: $ScriptVersion", " Subject: $($script:GCDO[0].NormalizedSubject)", " Organizer: $Script:Organizer", " MeetingID: $($script:GCDO[0].CleanGlobalObjectId)" diff --git a/Calendar/Get-CalendarDiagnosticObjectsSummary.ps1 b/Calendar/Get-CalendarDiagnosticObjectsSummary.ps1 index ae6c1ee7ed..e635b625bd 100644 --- a/Calendar/Get-CalendarDiagnosticObjectsSummary.ps1 +++ b/Calendar/Get-CalendarDiagnosticObjectsSummary.ps1 @@ -82,6 +82,11 @@ if (Test-ScriptVersion -AutoUpdate -VersionsUrl "https://aka.ms/CL-VersionsUrl" return } +$script:command = $MyInvocation +Write-Host -ForegroundColor Blue "The script was started with the following command line:" +Write-Host -ForegroundColor Blue "Name:" $command.MyCommand.name +Write-Host -ForegroundColor Blue "Command Line:" $command.line + Write-Verbose "Script Versions: $BuildVersion" # =================================================================================================== @@ -191,12 +196,13 @@ if (-not ([string]::IsNullOrEmpty($Subject)) ) { } Write-DashLineBoxColor "Hope this script was helpful in getting and understanding the Calendar Logs.", +"More Info on Getting the logs: https://learn.microsoft.com/en-us/exchange/troubleshoot/calendars/get-calendar-diagnostic-logs", +"and on Analyzing the logs: https://learn.microsoft.com/en-us/exchange/troubleshoot/calendars/analyze-calendar-diagnostic-logs", "If you have issues or suggestion for this script, please send them to: ", -"`t CalLogFormatterDevs@microsoft.com" -Color Yellow -DashChar = +"`t CalLogFormatterDevs@microsoft.com" -Color Yellow -DashChar "=" if ($ExportToExcel.IsPresent) { Write-Host Write-Host -ForegroundColor Blue -NoNewline "All Calendar Logs are saved to: " Write-Host -ForegroundColor Yellow ".\$Filename" - Write-Host } diff --git a/Calendar/Tests/ShortClientNameFunctions.Tests.ps1 b/Calendar/Tests/ShortClientNameFunctions.Tests.ps1 index a0ff932081..b6705a42ef 100644 --- a/Calendar/Tests/ShortClientNameFunctions.Tests.ps1 +++ b/Calendar/Tests/ShortClientNameFunctions.Tests.ps1 @@ -17,14 +17,14 @@ Describe "CreateShortClientName" { } Context "When LogClientInfoString is Client=MSExchangeRPC" { - It "Should return 'Outlook : Desktop : MAPI'" { + It "Should return 'Outlook:Desktop:MAPI'" { $result = CreateShortClientName -LogClientInfoString "Client=MSExchangeRPC" - $result | Should -Be "Outlook : Desktop : MAPI" + $result | Should -Be "Outlook:Desktop:MAPI" } } Context "When LogClientInfoString is Client=WebServices;Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.17328; Pro);;Client=WebServices;ExchangeServicesClient/0.9.248.0;" { - It "Should return 'Outlook : Desktop : MAPI' if LogClientInfoString FileContentMatch 'AppId=bcad1a65-78eb-4725-9bce-ce1a8ed30b95'" { + It "Should return 'Outlook:Desktop:MAPI' if LogClientInfoString FileContentMatch 'AppId=bcad1a65-78eb-4725-9bce-ce1a8ed30b95'" { $result = CreateShortClientName "Client=WebServices;Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.17328; Pro);;Client=WebServices;ExchangeServicesClient/0.9.248.0;" $result | Should -Be "Outlook : Desktop" } @@ -169,7 +169,7 @@ Describe "CreateShortClientName-FindMatch" { Context 'Test CreateShortClientName focusing on the FindMatch function' -ForEach @( @{ LogClientInfoString = 'Client=Hub Transport'; Expected = "Transport" }, - @{ LogClientInfoString = 'Client=MSExchangeRPC'; Expected = "Outlook : Desktop : MAPI" }, + @{ LogClientInfoString = 'Client=MSExchangeRPC'; Expected = "Outlook:Desktop:MAPI" }, @{ LogClientInfoString = 'OneOutlook'; Expected = "NewOutlook" }, @{ LogClientInfoString = 'Lync for Mac'; Expected = "LyncMac" }, @{ LogClientInfoString = 'AppId=00000004-0000-0ff1-ce00-000000000000'; Expected = "SkypeMMS" }, diff --git a/Diagnostics/ExchangeLogCollector/ExchangeLogCollector.ps1 b/Diagnostics/ExchangeLogCollector/ExchangeLogCollector.ps1 index d1143cf622..3540158137 100644 --- a/Diagnostics/ExchangeLogCollector/ExchangeLogCollector.ps1 +++ b/Diagnostics/ExchangeLogCollector/ExchangeLogCollector.ps1 @@ -14,10 +14,12 @@ param ( [bool]$AppSysLogsToXml = $true, [switch]$AutoDLogs, [switch]$CollectFailoverMetrics, + [switch]$ConversationLogs, [switch]$DAGInformation, [switch]$DailyPerformanceLogs, [switch]$EASLogs, [switch]$ECPLogs, + [switch]$EventBasedAssistantsLogs, [switch]$EWSLogs, [Alias("ExchangeServerInfo")] [switch]$ExchangeServerInformation, diff --git a/Diagnostics/ExchangeLogCollector/Helpers/Get-ArgumentList.ps1 b/Diagnostics/ExchangeLogCollector/Helpers/Get-ArgumentList.ps1 index 72bd9d454f..db99f9b533 100644 --- a/Diagnostics/ExchangeLogCollector/Helpers/Get-ArgumentList.ps1 +++ b/Diagnostics/ExchangeLogCollector/Helpers/Get-ArgumentList.ps1 @@ -31,11 +31,13 @@ function Get-ArgumentList { AppSysLogsToXml = $AppSysLogsToXml AutoDLogs = $AutoDLogs CollectAllLogsBasedOnLogAge = $CollectAllLogsBasedOnLogAge + ConversationLogs = $ConversationLogs DAGInformation = $DAGInformation DailyPerformanceLogs = $DailyPerformanceLogs TransportLogging = $TransportLogging EASLogs = $EASLogs ECPLogs = $ECPLogs + EventBasedAssistantsLogs = $EventBasedAssistantsLogs EWSLogs = $EWSLogs ExchangeServerInformation = $ExchangeServerInformation ExMon = $ExMon diff --git a/Diagnostics/ExchangeLogCollector/Helpers/Test-NoSwitchesProvided.ps1 b/Diagnostics/ExchangeLogCollector/Helpers/Test-NoSwitchesProvided.ps1 index b80a1c4535..30cab4d71d 100644 --- a/Diagnostics/ExchangeLogCollector/Helpers/Test-NoSwitchesProvided.ps1 +++ b/Diagnostics/ExchangeLogCollector/Helpers/Test-NoSwitchesProvided.ps1 @@ -7,6 +7,8 @@ function Test-NoSwitchesProvided { $IISLogs -or $DailyPerformanceLogs -or $ManagedAvailabilityLogs -or + $ConversationLogs -or + $EventBasedAssistantsLogs -or $ExPerfWiz -or $RPCLogs -or $EASLogs -or diff --git a/Diagnostics/ExchangeLogCollector/Helpers/Test-PossibleCommonScenarios.ps1 b/Diagnostics/ExchangeLogCollector/Helpers/Test-PossibleCommonScenarios.ps1 index d656a9f16c..5567123865 100644 --- a/Diagnostics/ExchangeLogCollector/Helpers/Test-PossibleCommonScenarios.ps1 +++ b/Diagnostics/ExchangeLogCollector/Helpers/Test-PossibleCommonScenarios.ps1 @@ -35,6 +35,8 @@ function Test-PossibleCommonScenarios { $Script:TransportProtocolLogs = $true $Script:MitigationService = $true $Script:MailboxAssistantsLogs = $true + $Script:EventBasedAssistantsLogs = $true + $Script:ConversationLogs = $true } if ($TransportLogging) { @@ -51,6 +53,7 @@ function Test-PossibleCommonScenarios { $Script:PipelineTracingLogs = $true $Script:TransportRules = $true $Script:AcceptedRemoteDomain = $true + $Script:EventBasedAssistantsLogs = $true } if ($TransportConnectivityLogs) { diff --git a/Diagnostics/ExchangeLogCollector/RemoteScriptBlock/Invoke-RemoteMain.ps1 b/Diagnostics/ExchangeLogCollector/RemoteScriptBlock/Invoke-RemoteMain.ps1 index 672ca814cb..e7b5d9efdd 100644 --- a/Diagnostics/ExchangeLogCollector/RemoteScriptBlock/Invoke-RemoteMain.ps1 +++ b/Diagnostics/ExchangeLogCollector/RemoteScriptBlock/Invoke-RemoteMain.ps1 @@ -204,6 +204,16 @@ function Invoke-RemoteMain { Add-LogCopyFullTaskAction $Script:localServerObject.TransportInfo.MBXLoggingInfo.PipelineTracingPath "Mailbox_Pipeline_Tracing_Logs" } } + + if ($PassedInfo.EventBasedAssistantsLogs -and $Script:localServerObject.Mailbox) { + Add-LogCopyFullTaskAction "$Script:localExInstall`Logging\EventBasedAssistants" "Event_Based_Assistants_Logs" + Add-LogCopyFullTaskAction "$Script:localExInstall`Logging\EventBasedAssistantsCollection" "Event_Based_Assistants_Collection_Logs" + } + + if ($PassedInfo.ConversationLogs -and $Script:localServerObject.Mailbox) { + Add-DefaultLogCopyTaskAction "$Script:localExInstall`Logging\ConversationAggregationLog" "Conversation_Aggregation_Logs" + Add-DefaultLogCopyTaskAction "$Script:localExInstall`Logging\ConversationProcessingLog" "Conversation_Processing_Logs" + } } ############################################ diff --git a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerExchangeInformation.ps1 b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerExchangeInformation.ps1 index c6ecf5a667..8033ba19f1 100644 --- a/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerExchangeInformation.ps1 +++ b/Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerExchangeInformation.ps1 @@ -549,6 +549,33 @@ function Invoke-AnalyzerExchangeInformation { } } + $monitoringOverrides = New-Object System.Collections.Generic.List[object] + foreach ($monitoringOverride in $HealthServerObject.OrganizationInformation.GetGlobalMonitoringOverride.SimpleView) { + $monitoringOverrides.Add($monitoringOverride) + } + foreach ($monitoringOverride in $exchangeInformation.GetServerMonitoringOverride.SimpleView) { + $monitoringOverrides.Add($monitoringOverride) + } + + $monitoringOverridesDetected = $monitoringOverrides.Count -gt 0 + $params = $baseParams + @{ + Name = "Monitoring Overrides Detected" + Details = $monitoringOverridesDetected + } + + Add-AnalyzedResultInformation @params + + if ($monitoringOverridesDetected) { + $params = $baseParams + @{ + OutColumns = ([PSCustomObject]@{ + DisplayObject = $monitoringOverrides + IndentSpaces = 12 + }) + HtmlName = "Monitoring Overrides" + } + Add-AnalyzedResultInformation @params + } + if ($null -ne $exchangeInformation.EdgeTransportResourceThrottling) { try { # SystemMemory does not block mail flow. diff --git a/Diagnostics/HealthChecker/DataCollection/ExchangeInformation/Get-ExchangeInformation.ps1 b/Diagnostics/HealthChecker/DataCollection/ExchangeInformation/Get-ExchangeInformation.ps1 index b510737207..86f60eeff6 100644 --- a/Diagnostics/HealthChecker/DataCollection/ExchangeInformation/Get-ExchangeInformation.ps1 +++ b/Diagnostics/HealthChecker/DataCollection/ExchangeInformation/Get-ExchangeInformation.ps1 @@ -8,6 +8,7 @@ . $PSScriptRoot\..\..\..\..\Shared\Get-ExchangeSettingOverride.ps1 . $PSScriptRoot\..\..\..\..\Shared\Get-ExSetupFileVersionInfo.ps1 . $PSScriptRoot\..\..\..\..\Shared\Get-FileContentInformation.ps1 +. $PSScriptRoot\..\..\..\..\Shared\Get-MonitoringOverride.ps1 . $PSScriptRoot\IISInformation\Get-ExchangeAppPoolsInformation.ps1 . $PSScriptRoot\IISInformation\Get-ExchangeServerIISSettings.ps1 . $PSScriptRoot\Get-ExchangeAES256CBCDetails.ps1 @@ -211,6 +212,8 @@ function Get-ExchangeInformation { } $computerMembership = Invoke-ScriptBlockHandler @params } + + [array]$serverMonitoringOverride = Get-MonitoringOverride -Server $Server } end { Write-Verbose "Exiting: Get-ExchangeInformation" @@ -236,6 +239,7 @@ function Get-ExchangeInformation { AES256CBCInformation = $aes256CbcDetails FileContentInformation = $fileContentInformation ComputerMembership = $computerMembership + GetServerMonitoringOverride = $serverMonitoringOverride } } } diff --git a/Diagnostics/HealthChecker/DataCollection/OrganizationInformation/Get-OrganizationInformation.ps1 b/Diagnostics/HealthChecker/DataCollection/OrganizationInformation/Get-OrganizationInformation.ps1 index d987c9eb6c..7f2b4dfc27 100644 --- a/Diagnostics/HealthChecker/DataCollection/OrganizationInformation/Get-OrganizationInformation.ps1 +++ b/Diagnostics/HealthChecker/DataCollection/OrganizationInformation/Get-OrganizationInformation.ps1 @@ -7,6 +7,7 @@ . $PSScriptRoot\Get-SecurityCve-2021-34470.ps1 . $PSScriptRoot\Get-SecurityCve-2022-21978.ps1 . $PSScriptRoot\..\..\..\..\Shared\ActiveDirectoryFunctions\Get-ExchangeADSplitPermissionsEnabled.ps1 +. $PSScriptRoot\..\..\..\..\Shared\Get-MonitoringOverride.ps1 . $PSScriptRoot\..\..\..\..\Shared\ErrorMonitorFunctions.ps1 . $PSScriptRoot\..\..\..\..\Shared\Invoke-CatchActionErrorLoop.ps1 function Get-OrganizationInformation { @@ -139,6 +140,8 @@ function Get-OrganizationInformation { $getSettingOverride = "Unknown" Invoke-CatchActions } + + [array]$globalMonitoringOverride = Get-MonitoringOverride } } end { return [PSCustomObject]@{ @@ -156,6 +159,7 @@ function Get-OrganizationInformation { GetSettingOverride = $getSettingOverride GetDynamicDgPublicFolderMailboxes = $getDdgPublicFolders GetIrmConfiguration = $getIrmConfiguration + GetGlobalMonitoringOverride = $globalMonitoringOverride } } } diff --git a/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetGlobalMonitoringOverride.xml b/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetGlobalMonitoringOverride.xml new file mode 100644 index 0000000000..07f1e537b9 --- /dev/null +++ b/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetGlobalMonitoringOverride.xml @@ -0,0 +1,81 @@ + + + + Deserialized.Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + Deserialized.Microsoft.Exchange.Data.ConfigurableObject + Deserialized.System.Object + + Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + + Probe + Enabled + 0 + FrontendTransport + OnPremisesInboundProxy + + 10/9/2024 8:58:55 PM + + Solo.com/Users/Han + 9/9/2024 8:58:55 PM + FrontendTransport\OnPremisesInboundProxy + true + New + + + AAEAAAD/////AQAAAAAAAAAMAgAAAGFNaWNyb3NvZnQuRXhjaGFuZ2UuTWFuYWdlbWVudCwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1DAMAAABbTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUBAAAAR01pY3Jvc29mdC5FeGNoYW5nZS5Nb25pdG9yaW5nLkFjdGl2ZU1vbml0b3JpbmcuTW9uaXRvcmluZ092ZXJyaWRlT2JqZWN0BAAAAAtwcm9wZXJ0eUJhZx5Db25maWd1cmFibGVPYmplY3QrcHJvcGVydHlCYWcsQ29uZmlndXJhYmxlT2JqZWN0K3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24mQ29uZmlndXJhYmxlT2JqZWN0K2luc3RhbnRpYXRpb25FcnJvcnMEBAMDMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAAMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAADlN5c3RlbS5WZXJzaW9uqQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlZhbGlkYXRpb25FcnJvciwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAgAAAAkEAAAACQQAAAAJBQAAAAoFBAAAADFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5QmFnBgAAABRQcm9wZXJ0eUJhZytyZWFkT25seRtQcm9wZXJ0eUJhZytzdG9yZVZhbHVlc09ubHknUHJvcGVydHlCYWcrdHJlYXRTd2l0Y2hhYmxlQXNWYWx1ZXNPbmx5JVByb3BlcnR5QmFnK3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24jUHJvcGVydHlCYWcrc2VyaWFsaXplZEN1cnJlbnRWYWx1ZXMkUHJvcGVydHlCYWcrc2VyaWFsaXplZE9yaWdpbmFsVmFsdWVzAAAAAwQEAQEBDlN5c3RlbS5WZXJzaW9uL01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5QmFnK1ZhbHVlUGFpcltdAwAAAC9NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXJbXQMAAAADAAAAAAAACQUAAAAJBgAAAAkHAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIDwAAAAAAAAAAAAAAAAAAAAcGAAAAAAEAAAALAAAABC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXIDAAAABfj///8tTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAgAAAANLZXkFVmFsdWUEAjhNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5RGVmaW5pdGlvbgMAAAADAAAACQkAAAAJCgAAAAH1////+P///wkMAAAACQ0AAAAB8v////j///8JDwAAAAkQAAAAAe/////4////CRIAAAAGEwAAAAVQcm9iZQHs////+P///wkVAAAABhYAAAAHRW5hYmxlZAHp////+P///wkYAAAABhkAAAABMAHm////+P///wkbAAAABhwAAAARRnJvbnRlbmRUcmFuc3BvcnQB4/////j///8JHgAAAAYfAAAAFk9uUHJlbWlzZXNJbmJvdW5kUHJveHkB4P////j///8JIQAAAAYiAAAAFDEwLzkvMjAyNCA4OjU4OjU1IFBNAd3////4////CSQAAAAGJQAAABJTb2xvLmNvbS9Vc2Vycy9IYW4B2v////j///8JJwAAAAYoAAAAEzkvOS8yMDI0IDg6NTg6NTUgUE0HBwAAAAABAAAACwAAAAQtTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAwAAAAHX////+P///wkPAAAACgHV////+P///wkSAAAACgHT////+P///wkVAAAACgHR////+P///wkYAAAACgHP////+P///wkbAAAACgHN////+P///wkeAAAACgHL////+P///wk2AAAACgHJ////+P///wkhAAAACgHH////+P///wk6AAAACgHF////+P///wkkAAAACgHD////+P///wknAAAACgUJAAAAOE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlEZWZpbml0aW9uBQAAAAVmbGFncxdQcm9wZXJ0eURlZmluaXRpb24rbmFtZRdQcm9wZXJ0eURlZmluaXRpb24rdHlwZRtQcm9wZXJ0eURlZmluaXRpb24rdHlwZU5hbWU5UHJvcGVydHlEZWZpbml0aW9uK3JlcXVpcmVkUHJvcGVydHlEZWZpbml0aW9uc1doZW5SZWFkaW5nAAEDAQMIH1N5c3RlbS5Vbml0eVNlcmlhbGl6YXRpb25Ib2xkZXKzAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uYDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5RGVmaW5pdGlvbiwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAwAAAAABAAAGPwAAAAtPYmplY3RTdGF0ZQlAAAAABkEAAACAAU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlLCBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1CgUKAAAAI01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlAQAAAAd2YWx1ZV9fAAgDAAAAAAAAAAEMAAAACQAAAAAAAAAGQgAAAA9FeGNoYW5nZVZlcnNpb24JQwAAAAZEAAAAigFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24sIE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUKBQ0AAAAtTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VPYmplY3RWZXJzaW9uAwAAAAVNYWpvcgVNaW5vcg1FeGNoYW5nZUJ1aWxkAAAEAgIlTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VCdWlsZAMAAAADAAAAABQFu////yVNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZUJ1aWxkBAAAAAVNYWpvcgVNaW5vcgVCdWlsZA1CdWlsZFJldmlzaW9uAAAAAAICDg4DAAAADwAAAAAAAQ8AAAAJAAAAAAAAAAZGAAAACElkZW50aXR5CUcAAAAGSAAAAH1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RJZCwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQoFEAAAAF5NaWNyb3NvZnQuRXhjaGFuZ2UuTW9uaXRvcmluZy5BY3RpdmVNb25pdG9yaW5nLk1vbml0b3JpbmdPdmVycmlkZU9iamVjdCtNb25pdG9yaW5nSXRlbUlkZW50aXR5AQAAAAhpZGVudGl0eQECAAAABkkAAAAoRnJvbnRlbmRUcmFuc3BvcnRcT25QcmVtaXNlc0luYm91bmRQcm94eQESAAAACQAAAAAAAAAGSgAAAAhJdGVtVHlwZQlLAAAABkwAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEVAAAACQAAAAAAAAAGTQAAAAxQcm9wZXJ0eU5hbWUJSwAAAAZPAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBGAAAAAkAAAAAAAAABlAAAAANUHJvcGVydHlWYWx1ZQlLAAAABlIAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEbAAAACQAAAAAAAAAGUwAAAA1IZWFsdGhTZXROYW1lCUsAAAAGVQAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKAR4AAAAJAAAAAAAAAAZWAAAAEk1vbml0b3JpbmdJdGVtTmFtZQlLAAAABlgAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEhAAAACQAAAAAAAAAGWQAAAA5FeHBpcmF0aW9uVGltZQlLAAAABlsAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEkAAAACQAAAAAAAAAGXAAAAAlDcmVhdGVkQnkJSwAAAAZeAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBJwAAAAkAAAAAAAAABl8AAAALQ3JlYXRlZFRpbWUJSwAAAAZhAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBNgAAAAkAAAAAAAAABmIAAAAOVGFyZ2V0UmVzb3VyY2UJSwAAAAZkAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBOgAAAAkAAAAAAAAABmUAAAAMQXBwbHlWZXJzaW9uCUsAAAAGZwAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKBEAAAAAfU3lzdGVtLlVuaXR5U2VyaWFsaXphdGlvbkhvbGRlcgMAAAAERGF0YQlVbml0eVR5cGUMQXNzZW1ibHlOYW1lAQABCAZoAAAAI01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlBAAAAAZpAAAAW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUBQwAAAEAAAAAGagAAAC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24EAAAACWkAAAABRwAAAEAAAAAGbAAAACBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RJZAQAAAAJaQAAAAFLAAAAQAAAAAZuAAAADVN5c3RlbS5TdHJpbmcEAAAABm8AAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Cw== + solo-e19a.solo.com + 6f717724-bc29-4a09-a19f-5512f339b875 + false + + + + + Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + + Responder + Enabled + 0 + AD + ActiveDirectoryConnectivityConfigDCServerReboot + + 9/29/2024 5:53:08 PM + + Solo.com/Users/Han + 9/9/2024 5:53:08 PM + AD\ActiveDirectoryConnectivityConfigDCServerReboot + true + New + + + AAEAAAD/////AQAAAAAAAAAMAgAAAGFNaWNyb3NvZnQuRXhjaGFuZ2UuTWFuYWdlbWVudCwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1DAMAAABbTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUBAAAAR01pY3Jvc29mdC5FeGNoYW5nZS5Nb25pdG9yaW5nLkFjdGl2ZU1vbml0b3JpbmcuTW9uaXRvcmluZ092ZXJyaWRlT2JqZWN0BAAAAAtwcm9wZXJ0eUJhZx5Db25maWd1cmFibGVPYmplY3QrcHJvcGVydHlCYWcsQ29uZmlndXJhYmxlT2JqZWN0K3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24mQ29uZmlndXJhYmxlT2JqZWN0K2luc3RhbnRpYXRpb25FcnJvcnMEBAMDMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAAMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAADlN5c3RlbS5WZXJzaW9uqQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlZhbGlkYXRpb25FcnJvciwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAgAAAAkEAAAACQQAAAAJBQAAAAoFBAAAADFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5QmFnBgAAABRQcm9wZXJ0eUJhZytyZWFkT25seRtQcm9wZXJ0eUJhZytzdG9yZVZhbHVlc09ubHknUHJvcGVydHlCYWcrdHJlYXRTd2l0Y2hhYmxlQXNWYWx1ZXNPbmx5JVByb3BlcnR5QmFnK3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24jUHJvcGVydHlCYWcrc2VyaWFsaXplZEN1cnJlbnRWYWx1ZXMkUHJvcGVydHlCYWcrc2VyaWFsaXplZE9yaWdpbmFsVmFsdWVzAAAAAwQEAQEBDlN5c3RlbS5WZXJzaW9uL01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5QmFnK1ZhbHVlUGFpcltdAwAAAC9NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXJbXQMAAAADAAAAAAAACQUAAAAJBgAAAAkHAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIDwAAAAAAAAAAAAAAAAAAAAcGAAAAAAEAAAALAAAABC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXIDAAAABfj///8tTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAgAAAANLZXkFVmFsdWUEAjhNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5RGVmaW5pdGlvbgMAAAADAAAACQkAAAAJCgAAAAH1////+P///wkMAAAACQ0AAAAB8v////j///8JDwAAAAkQAAAAAe/////4////CRIAAAAGEwAAAAlSZXNwb25kZXIB7P////j///8JFQAAAAYWAAAAB0VuYWJsZWQB6f////j///8JGAAAAAYZAAAAATAB5v////j///8JGwAAAAYcAAAAAkFEAeP////4////CR4AAAAGHwAAAC9BY3RpdmVEaXJlY3RvcnlDb25uZWN0aXZpdHlDb25maWdEQ1NlcnZlclJlYm9vdAHg////+P///wkhAAAABiIAAAAUOS8yOS8yMDI0IDU6NTM6MDggUE0B3f////j///8JJAAAAAYlAAAAElNvbG8uY29tL1VzZXJzL0hhbgHa////+P///wknAAAABigAAAATOS85LzIwMjQgNTo1MzowOCBQTQcHAAAAAAEAAAALAAAABC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXIDAAAAAdf////4////CQ8AAAAKAdX////4////CRIAAAAKAdP////4////CRUAAAAKAdH////4////CRgAAAAKAc/////4////CRsAAAAKAc3////4////CR4AAAAKAcv////4////CTYAAAAKAcn////4////CSEAAAAKAcf////4////CToAAAAKAcX////4////CSQAAAAKAcP////4////CScAAAAKBQkAAAA4TWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuU2ltcGxlUHJvdmlkZXJQcm9wZXJ0eURlZmluaXRpb24FAAAABWZsYWdzF1Byb3BlcnR5RGVmaW5pdGlvbituYW1lF1Byb3BlcnR5RGVmaW5pdGlvbit0eXBlG1Byb3BlcnR5RGVmaW5pdGlvbit0eXBlTmFtZTlQcm9wZXJ0eURlZmluaXRpb24rcmVxdWlyZWRQcm9wZXJ0eURlZmluaXRpb25zV2hlblJlYWRpbmcAAQMBAwgfU3lzdGVtLlVuaXR5U2VyaWFsaXphdGlvbkhvbGRlcrMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbGxlY3Rpb25gMVtbTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlEZWZpbml0aW9uLCBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1XV0DAAAAAAEAAAY/AAAAC09iamVjdFN0YXRlCUAAAAAGQQAAAIABTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuT2JqZWN0U3RhdGUsIE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUKBQoAAAAjTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuT2JqZWN0U3RhdGUBAAAAB3ZhbHVlX18ACAMAAAAAAAAAAQwAAAAJAAAAAAAAAAZCAAAAD0V4Y2hhbmdlVmVyc2lvbglDAAAABkQAAACKAU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLkV4Y2hhbmdlT2JqZWN0VmVyc2lvbiwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQoFDQAAAC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24DAAAABU1ham9yBU1pbm9yDUV4Y2hhbmdlQnVpbGQAAAQCAiVNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZUJ1aWxkAwAAAAMAAAAAFAW7////JU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLkV4Y2hhbmdlQnVpbGQEAAAABU1ham9yBU1pbm9yBUJ1aWxkDUJ1aWxkUmV2aXNpb24AAAAAAgIODgMAAAAPAAAAAAABDwAAAAkAAAAAAAAABkYAAAAISWRlbnRpdHkJRwAAAAZIAAAAfU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdElkLCBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1CgUQAAAAXk1pY3Jvc29mdC5FeGNoYW5nZS5Nb25pdG9yaW5nLkFjdGl2ZU1vbml0b3JpbmcuTW9uaXRvcmluZ092ZXJyaWRlT2JqZWN0K01vbml0b3JpbmdJdGVtSWRlbnRpdHkBAAAACGlkZW50aXR5AQIAAAAGSQAAADJBRFxBY3RpdmVEaXJlY3RvcnlDb25uZWN0aXZpdHlDb25maWdEQ1NlcnZlclJlYm9vdAESAAAACQAAAAAAAAAGSgAAAAhJdGVtVHlwZQlLAAAABkwAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEVAAAACQAAAAAAAAAGTQAAAAxQcm9wZXJ0eU5hbWUJSwAAAAZPAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBGAAAAAkAAAAAAAAABlAAAAANUHJvcGVydHlWYWx1ZQlLAAAABlIAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEbAAAACQAAAAAAAAAGUwAAAA1IZWFsdGhTZXROYW1lCUsAAAAGVQAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKAR4AAAAJAAAAAAAAAAZWAAAAEk1vbml0b3JpbmdJdGVtTmFtZQlLAAAABlgAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEhAAAACQAAAAAAAAAGWQAAAA5FeHBpcmF0aW9uVGltZQlLAAAABlsAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEkAAAACQAAAAAAAAAGXAAAAAlDcmVhdGVkQnkJSwAAAAZeAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBJwAAAAkAAAAAAAAABl8AAAALQ3JlYXRlZFRpbWUJSwAAAAZhAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBNgAAAAkAAAAAAAAABmIAAAAOVGFyZ2V0UmVzb3VyY2UJSwAAAAZkAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBOgAAAAkAAAAAAAAABmUAAAAMQXBwbHlWZXJzaW9uCUsAAAAGZwAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKBEAAAAAfU3lzdGVtLlVuaXR5U2VyaWFsaXphdGlvbkhvbGRlcgMAAAAERGF0YQlVbml0eVR5cGUMQXNzZW1ibHlOYW1lAQABCAZoAAAAI01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlBAAAAAZpAAAAW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUBQwAAAEAAAAAGagAAAC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24EAAAACWkAAAABRwAAAEAAAAAGbAAAACBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RJZAQAAAAJaQAAAAFLAAAAQAAAAAZuAAAADVN5c3RlbS5TdHJpbmcEAAAABm8AAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Cw== + solo-e19a.solo.com + 6f717724-bc29-4a09-a19f-5512f339b875 + false + + + + + Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + + Responder + Enabled + 0 + MailboxSpace + StorageLogicalDriveSpaceEscalate + + 9/9/2025 9:00:36 PM + Version 15.2 (Build 1118.7) + Solo.com/Users/Han + 9/9/2024 9:00:36 PM + MailboxSpace\StorageLogicalDriveSpaceEscalate + true + New + + + AAEAAAD/////AQAAAAAAAAAMAgAAAGFNaWNyb3NvZnQuRXhjaGFuZ2UuTWFuYWdlbWVudCwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1DAMAAABbTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUBAAAAR01pY3Jvc29mdC5FeGNoYW5nZS5Nb25pdG9yaW5nLkFjdGl2ZU1vbml0b3JpbmcuTW9uaXRvcmluZ092ZXJyaWRlT2JqZWN0BAAAAAtwcm9wZXJ0eUJhZx5Db25maWd1cmFibGVPYmplY3QrcHJvcGVydHlCYWcsQ29uZmlndXJhYmxlT2JqZWN0K3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24mQ29uZmlndXJhYmxlT2JqZWN0K2luc3RhbnRpYXRpb25FcnJvcnMEBAMDMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAAMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAADlN5c3RlbS5WZXJzaW9uqQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlZhbGlkYXRpb25FcnJvciwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAgAAAAkEAAAACQQAAAAJBQAAAAoFBAAAADFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5QmFnBgAAABRQcm9wZXJ0eUJhZytyZWFkT25seRtQcm9wZXJ0eUJhZytzdG9yZVZhbHVlc09ubHknUHJvcGVydHlCYWcrdHJlYXRTd2l0Y2hhYmxlQXNWYWx1ZXNPbmx5JVByb3BlcnR5QmFnK3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24jUHJvcGVydHlCYWcrc2VyaWFsaXplZEN1cnJlbnRWYWx1ZXMkUHJvcGVydHlCYWcrc2VyaWFsaXplZE9yaWdpbmFsVmFsdWVzAAAAAwQEAQEBDlN5c3RlbS5WZXJzaW9uL01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5QmFnK1ZhbHVlUGFpcltdAwAAAC9NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXJbXQMAAAADAAAAAAAACQUAAAAJBgAAAAkHAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIDwAAAAAAAAAAAAAAAAAAAAcGAAAAAAEAAAAMAAAABC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXIDAAAABfj///8tTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAgAAAANLZXkFVmFsdWUEAjhNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5RGVmaW5pdGlvbgMAAAADAAAACQkAAAAJCgAAAAH1////+P///wkMAAAACQ0AAAAB8v////j///8JDwAAAAkQAAAAAe/////4////CRIAAAAGEwAAAAlSZXNwb25kZXIB7P////j///8JFQAAAAYWAAAAB0VuYWJsZWQB6f////j///8JGAAAAAYZAAAAATAB5v////j///8JGwAAAAYcAAAADE1haWxib3hTcGFjZQHj////+P///wkeAAAABh8AAAAgU3RvcmFnZUxvZ2ljYWxEcml2ZVNwYWNlRXNjYWxhdGUB4P////j///8JIQAAAAYiAAAAEzkvOS8yMDI1IDk6MDA6MzYgUE0B3f////j///8JJAAAAAYlAAAAG1ZlcnNpb24gMTUuMiAoQnVpbGQgMTExOC43KQHa////+P///wknAAAABigAAAASU29sby5jb20vVXNlcnMvSGFuAdf////4////CSoAAAAGKwAAABM5LzkvMjAyNCA5OjAwOjM2IFBNBwcAAAAAAQAAAAsAAAAELU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5QmFnK1ZhbHVlUGFpcgMAAAAB1P////j///8JDwAAAAoB0v////j///8JEgAAAAoB0P////j///8JFQAAAAoBzv////j///8JGAAAAAoBzP////j///8JGwAAAAoByv////j///8JHgAAAAoByP////j///8JOQAAAAoBxv////j///8JIQAAAAoBxP////j///8JJAAAAAoBwv////j///8JJwAAAAoBwP////j///8JKgAAAAoFCQAAADhNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5RGVmaW5pdGlvbgUAAAAFZmxhZ3MXUHJvcGVydHlEZWZpbml0aW9uK25hbWUXUHJvcGVydHlEZWZpbml0aW9uK3R5cGUbUHJvcGVydHlEZWZpbml0aW9uK3R5cGVOYW1lOVByb3BlcnR5RGVmaW5pdGlvbityZXF1aXJlZFByb3BlcnR5RGVmaW5pdGlvbnNXaGVuUmVhZGluZwABAwEDCB9TeXN0ZW0uVW5pdHlTZXJpYWxpemF0aW9uSG9sZGVyswFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbmAxW1tNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eURlZmluaXRpb24sIE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzVdXQMAAAAAAQAABkIAAAALT2JqZWN0U3RhdGUJQwAAAAZEAAAAgAFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RTdGF0ZSwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQoFCgAAACNNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RTdGF0ZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAABDAAAAAkAAAAAAAAABkUAAAAPRXhjaGFuZ2VWZXJzaW9uCUYAAAAGRwAAAIoBTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VPYmplY3RWZXJzaW9uLCBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1CgUNAAAALU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLkV4Y2hhbmdlT2JqZWN0VmVyc2lvbgMAAAAFTWFqb3IFTWlub3INRXhjaGFuZ2VCdWlsZAAABAICJU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLkV4Y2hhbmdlQnVpbGQDAAAAAwAAAAAUBbj///8lTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VCdWlsZAQAAAAFTWFqb3IFTWlub3IFQnVpbGQNQnVpbGRSZXZpc2lvbgAAAAACAg4OAwAAAA8AAAAAAAEPAAAACQAAAAAAAAAGSQAAAAhJZGVudGl0eQlKAAAABksAAAB9TWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuT2JqZWN0SWQsIE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUKBRAAAABeTWljcm9zb2Z0LkV4Y2hhbmdlLk1vbml0b3JpbmcuQWN0aXZlTW9uaXRvcmluZy5Nb25pdG9yaW5nT3ZlcnJpZGVPYmplY3QrTW9uaXRvcmluZ0l0ZW1JZGVudGl0eQEAAAAIaWRlbnRpdHkBAgAAAAZMAAAALU1haWxib3hTcGFjZVxTdG9yYWdlTG9naWNhbERyaXZlU3BhY2VFc2NhbGF0ZQESAAAACQAAAAAAAAAGTQAAAAhJdGVtVHlwZQlOAAAABk8AAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEVAAAACQAAAAAAAAAGUAAAAAxQcm9wZXJ0eU5hbWUJTgAAAAZSAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBGAAAAAkAAAAAAAAABlMAAAANUHJvcGVydHlWYWx1ZQlOAAAABlUAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEbAAAACQAAAAAAAAAGVgAAAA1IZWFsdGhTZXROYW1lCU4AAAAGWAAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKAR4AAAAJAAAAAAAAAAZZAAAAEk1vbml0b3JpbmdJdGVtTmFtZQlOAAAABlsAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEhAAAACQAAAAAAAAAGXAAAAA5FeHBpcmF0aW9uVGltZQlOAAAABl4AAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEkAAAACQAAAAAAAAAGXwAAAAxBcHBseVZlcnNpb24JTgAAAAZhAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBJwAAAAkAAAAAAAAABmIAAAAJQ3JlYXRlZEJ5CU4AAAAGZAAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKASoAAAAJAAAAAAAAAAZlAAAAC0NyZWF0ZWRUaW1lCU4AAAAGZwAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKATkAAAAJAAAAAAAAAAZoAAAADlRhcmdldFJlc291cmNlCU4AAAAGagAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKBEMAAAAfU3lzdGVtLlVuaXR5U2VyaWFsaXphdGlvbkhvbGRlcgMAAAAERGF0YQlVbml0eVR5cGUMQXNzZW1ibHlOYW1lAQABCAZrAAAAI01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlBAAAAAZsAAAAW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUBRgAAAEMAAAAGbQAAAC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24EAAAACWwAAAABSgAAAEMAAAAGbwAAACBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RJZAQAAAAJbAAAAAFOAAAAQwAAAAZxAAAADVN5c3RlbS5TdHJpbmcEAAAABnIAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Cw== + solo-e19a.solo.com + 6f717724-bc29-4a09-a19f-5512f339b875 + false + + + \ No newline at end of file diff --git a/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetServerMonitoringOverride.xml b/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetServerMonitoringOverride.xml new file mode 100644 index 0000000000..51c3b8ef70 --- /dev/null +++ b/Diagnostics/HealthChecker/Tests/DataCollection/E19/Exchange/GetServerMonitoringOverride.xml @@ -0,0 +1,31 @@ + + + + Deserialized.Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + Deserialized.Microsoft.Exchange.Data.ConfigurableObject + Deserialized.System.Object + + Microsoft.Exchange.Monitoring.ActiveMonitoring.MonitoringOverrideObject + + Responder + Enabled + 0 + AD + ActiveDirectoryConnectivityConfigDCServerReboot + + 2024-09-29 17:40:49Z + + Solo.com/Users/Han + 2024-09-09 17:40:49Z + AD\ActiveDirectoryConnectivityConfigDCServerReboot + true + New + + + AAEAAAD/////AQAAAAAAAAAMAgAAAGFNaWNyb3NvZnQuRXhjaGFuZ2UuTWFuYWdlbWVudCwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1DAMAAABbTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUBAAAAR01pY3Jvc29mdC5FeGNoYW5nZS5Nb25pdG9yaW5nLkFjdGl2ZU1vbml0b3JpbmcuTW9uaXRvcmluZ092ZXJyaWRlT2JqZWN0BAAAAAtwcm9wZXJ0eUJhZx5Db25maWd1cmFibGVPYmplY3QrcHJvcGVydHlCYWcsQ29uZmlndXJhYmxlT2JqZWN0K3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24mQ29uZmlndXJhYmxlT2JqZWN0K2luc3RhbnRpYXRpb25FcnJvcnMEBAMDMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAAMU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlCYWcDAAAADlN5c3RlbS5WZXJzaW9uqQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlZhbGlkYXRpb25FcnJvciwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAgAAAAkEAAAACQQAAAAJBQAAAAoFBAAAADFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5QmFnBgAAABRQcm9wZXJ0eUJhZytyZWFkT25seRtQcm9wZXJ0eUJhZytzdG9yZVZhbHVlc09ubHknUHJvcGVydHlCYWcrdHJlYXRTd2l0Y2hhYmxlQXNWYWx1ZXNPbmx5JVByb3BlcnR5QmFnK3NlcmlhbGl6ZXJBc3NlbWJseVZlcnNpb24jUHJvcGVydHlCYWcrc2VyaWFsaXplZEN1cnJlbnRWYWx1ZXMkUHJvcGVydHlCYWcrc2VyaWFsaXplZE9yaWdpbmFsVmFsdWVzAAAAAwQEAQEBDlN5c3RlbS5WZXJzaW9uL01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5QmFnK1ZhbHVlUGFpcltdAwAAAC9NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXJbXQMAAAADAAAAAAAACQUAAAAJBgAAAAkHAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIDwAAAAAAAAAAAAAAAAAAAAcGAAAAAAEAAAALAAAABC1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5Qcm9wZXJ0eUJhZytWYWx1ZVBhaXIDAAAABfj///8tTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAgAAAANLZXkFVmFsdWUEAjhNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5TaW1wbGVQcm92aWRlclByb3BlcnR5RGVmaW5pdGlvbgMAAAADAAAACQkAAAAJCgAAAAH1////+P///wkMAAAACQ0AAAAB8v////j///8JDwAAAAkQAAAAAe/////4////CRIAAAAGEwAAAAlSZXNwb25kZXIB7P////j///8JFQAAAAYWAAAAB0VuYWJsZWQB6f////j///8JGAAAAAYZAAAAATAB5v////j///8JGwAAAAYcAAAAAkFEAeP////4////CR4AAAAGHwAAAC9BY3RpdmVEaXJlY3RvcnlDb25uZWN0aXZpdHlDb25maWdEQ1NlcnZlclJlYm9vdAHg////+P///wkhAAAABiIAAAAUMjAyNC0wOS0yOSAxNzo0MDo0OVoB3f////j///8JJAAAAAYlAAAAElNvbG8uY29tL1VzZXJzL0hhbgHa////+P///wknAAAABigAAAAUMjAyNC0wOS0wOSAxNzo0MDo0OVoHBwAAAAABAAAACwAAAAQtTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuUHJvcGVydHlCYWcrVmFsdWVQYWlyAwAAAAHX////+P///wkPAAAACgHV////+P///wkSAAAACgHT////+P///wkVAAAACgHR////+P///wkYAAAACgHP////+P///wkbAAAACgHN////+P///wkeAAAACgHL////+P///wk2AAAACgHJ////+P///wkhAAAACgHH////+P///wk6AAAACgHF////+P///wkkAAAACgHD////+P///wknAAAACgUJAAAAOE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlNpbXBsZVByb3ZpZGVyUHJvcGVydHlEZWZpbml0aW9uBQAAAAVmbGFncxdQcm9wZXJ0eURlZmluaXRpb24rbmFtZRdQcm9wZXJ0eURlZmluaXRpb24rdHlwZRtQcm9wZXJ0eURlZmluaXRpb24rdHlwZU5hbWU5UHJvcGVydHlEZWZpbml0aW9uK3JlcXVpcmVkUHJvcGVydHlEZWZpbml0aW9uc1doZW5SZWFkaW5nAAEDAQMIH1N5c3RlbS5Vbml0eVNlcmlhbGl6YXRpb25Ib2xkZXKzAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uYDFbW01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLlByb3BlcnR5RGVmaW5pdGlvbiwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNV1dAwAAAAABAAAGPwAAAAtPYmplY3RTdGF0ZQlAAAAABkEAAACAAU1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlLCBNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1CgUKAAAAI01pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLk9iamVjdFN0YXRlAQAAAAd2YWx1ZV9fAAgDAAAAAAAAAAEMAAAACQAAAAAAAAAGQgAAAA9FeGNoYW5nZVZlcnNpb24JQwAAAAZEAAAAigFNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZU9iamVjdFZlcnNpb24sIE1pY3Jvc29mdC5FeGNoYW5nZS5EYXRhLCBWZXJzaW9uPTE1LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUKBQ0AAAAtTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VPYmplY3RWZXJzaW9uAwAAAAVNYWpvcgVNaW5vcg1FeGNoYW5nZUJ1aWxkAAAEAgIlTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VCdWlsZAMAAAADAAAAABQFu////yVNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5FeGNoYW5nZUJ1aWxkBAAAAAVNYWpvcgVNaW5vcgVCdWlsZA1CdWlsZFJldmlzaW9uAAAAAAICDg4DAAAADwAAAAAAAQ8AAAAJAAAAAAAAAAZGAAAACElkZW50aXR5CUcAAAAGSAAAAH1NaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RJZCwgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQoFEAAAAF5NaWNyb3NvZnQuRXhjaGFuZ2UuTW9uaXRvcmluZy5BY3RpdmVNb25pdG9yaW5nLk1vbml0b3JpbmdPdmVycmlkZU9iamVjdCtNb25pdG9yaW5nSXRlbUlkZW50aXR5AQAAAAhpZGVudGl0eQECAAAABkkAAAAyQURcQWN0aXZlRGlyZWN0b3J5Q29ubmVjdGl2aXR5Q29uZmlnRENTZXJ2ZXJSZWJvb3QBEgAAAAkAAAAAAAAABkoAAAAISXRlbVR5cGUJSwAAAAZMAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBFQAAAAkAAAAAAAAABk0AAAAMUHJvcGVydHlOYW1lCUsAAAAGTwAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKARgAAAAJAAAAAAAAAAZQAAAADVByb3BlcnR5VmFsdWUJSwAAAAZSAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBGwAAAAkAAAAAAAAABlMAAAANSGVhbHRoU2V0TmFtZQlLAAAABlUAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgEeAAAACQAAAAAAAAAGVgAAABJNb25pdG9yaW5nSXRlbU5hbWUJSwAAAAZYAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBIQAAAAkAAAAAAAAABlkAAAAORXhwaXJhdGlvblRpbWUJSwAAAAZbAAAAWlN5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoBJAAAAAkAAAAAAAAABlwAAAAJQ3JlYXRlZEJ5CUsAAAAGXgAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKAScAAAAJAAAAAAAAAAZfAAAAC0NyZWF0ZWRUaW1lCUsAAAAGYQAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKATYAAAAJAAAAAAAAAAZiAAAADlRhcmdldFJlc291cmNlCUsAAAAGZAAAAFpTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKAToAAAAJAAAAAAAAAAZlAAAADEFwcGx5VmVyc2lvbglLAAAABmcAAABaU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgRAAAAAH1N5c3RlbS5Vbml0eVNlcmlhbGl6YXRpb25Ib2xkZXIDAAAABERhdGEJVW5pdHlUeXBlDEFzc2VtYmx5TmFtZQEAAQgGaAAAACNNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YS5PYmplY3RTdGF0ZQQAAAAGaQAAAFtNaWNyb3NvZnQuRXhjaGFuZ2UuRGF0YSwgVmVyc2lvbj0xNS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1AUMAAABAAAAABmoAAAAtTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuRXhjaGFuZ2VPYmplY3RWZXJzaW9uBAAAAAlpAAAAAUcAAABAAAAABmwAAAAgTWljcm9zb2Z0LkV4Y2hhbmdlLkRhdGEuT2JqZWN0SWQEAAAACWkAAAABSwAAAEAAAAAGbgAAAA1TeXN0ZW0uU3RyaW5nBAAAAAZvAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQs= + solo-e19a.solo.com + 6f717724-bc29-4a09-a19f-5512f339b875 + false + + + \ No newline at end of file diff --git a/Diagnostics/HealthChecker/Tests/HealthChecker.E15.Main.Tests.ps1 b/Diagnostics/HealthChecker/Tests/HealthChecker.E15.Main.Tests.ps1 index 9a809cd3e6..50c6043ba8 100644 --- a/Diagnostics/HealthChecker/Tests/HealthChecker.E15.Main.Tests.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthChecker.E15.Main.Tests.ps1 @@ -32,7 +32,7 @@ Describe "Testing Health Checker by Mock Data Imports - Exchange 2013" { TestObjectMatch "Internet Web Proxy" "Not Set" TestObjectMatch "Extended Protection Enabled (Any VDir)" $false TestObjectMatch "Setting Overrides Detected" $false - $Script:ActiveGrouping.Count | Should -Be 17 + $Script:ActiveGrouping.Count | Should -Be 18 } It "Display Results - Organization Information" { diff --git a/Diagnostics/HealthChecker/Tests/HealthChecker.E16.Main.Tests.ps1 b/Diagnostics/HealthChecker/Tests/HealthChecker.E16.Main.Tests.ps1 index 06c167aa13..ee362c9f71 100644 --- a/Diagnostics/HealthChecker/Tests/HealthChecker.E16.Main.Tests.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthChecker.E16.Main.Tests.ps1 @@ -33,7 +33,7 @@ Describe "Testing Health Checker by Mock Data Imports - Exchange 2016" { TestObjectMatch "Extended Protection Enabled (Any VDir)" $false TestObjectMatch "Setting Overrides Detected" $false TestObjectMatch "Exchange Server Membership" "Passed" - $Script:ActiveGrouping.Count | Should -Be 15 + $Script:ActiveGrouping.Count | Should -Be 16 } It "Display Results - Organization Information" { diff --git a/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Main.Tests.ps1 b/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Main.Tests.ps1 index a46a293113..228af158ba 100644 --- a/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Main.Tests.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Main.Tests.ps1 @@ -31,9 +31,10 @@ Describe "Testing Health Checker by Mock Data Imports" { TestObjectMatch "Internet Web Proxy" "Not Set" TestObjectMatch "Extended Protection Enabled (Any VDir)" $false TestObjectMatch "Setting Overrides Detected" $false + TestObjectMatch "Monitoring Overrides Detected" $false TestObjectMatch "Out of Date" $true -WriteType "Red" TestObjectMatch "Exchange Server Membership" "Passed" - $Script:ActiveGrouping.Count | Should -Be 15 + $Script:ActiveGrouping.Count | Should -Be 16 } It "Display Results - Organization Information" { diff --git a/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Scenarios.Tests.ps1 b/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Scenarios.Tests.ps1 index 39f4c32452..198ff3ec5d 100644 --- a/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Scenarios.Tests.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthChecker.E19.Scenarios.Tests.ps1 @@ -52,6 +52,8 @@ Describe "Testing Health Checker by Mock Data Imports" { Mock Get-LocalGroupMember { return Import-Clixml "$Script:MockDataCollectionRoot\Exchange\GetLocalGroupMember2.xml" } Mock Get-WindowsFeature { return Import-Clixml "$Script:MockDataCollectionRoot\OS\GetWindowsFeature1.xml" } Mock Get-SmbServerConfiguration { return Import-Clixml "$Script:MockDataCollectionRoot\OS\GetSmbServerConfiguration1.xml" } + Mock Get-GlobalMonitoringOverride { return Import-Clixml "$Script:MockDataCollectionRoot\Exchange\GetGlobalMonitoringOverride.xml" } + Mock Get-ServerMonitoringOverride { return Import-Clixml "$Script:MockDataCollectionRoot\Exchange\GetServerMonitoringOverride.xml" } Mock Get-WinEvent -ParameterFilter { $LogName -eq "Application" -and $Oldest -eq $true -and $MaxEvents -eq 1 } -MockWith { $r = Import-Clixml "$Script:MockDataCollectionRoot\OS\GetWinEventOldestApplication.xml" $r.TimeCreated = ((Get-Date).AddDays(-1)) @@ -121,6 +123,7 @@ Describe "Testing Health Checker by Mock Data Imports" { TestObjectMatch "Exchange Server Membership" "Failed" -WriteType "Red" TestObjectMatch "Exchange Trusted Subsystem - Local System Membership" "Exchange Trusted Subsystem - Local System Membership" -WriteType "Red" TestObjectMatch "Exchange Trusted Subsystem - AD Group Membership" "Exchange Trusted Subsystem - AD Group Membership" -WriteType "Red" + TestObjectMatch "Monitoring Overrides Detected" $true $hotfixInstalled = GetObject "Exchange IU" $hotfixInstalled.Count | Should -Be 2 } diff --git a/Diagnostics/HealthChecker/Tests/HealthChecker.MockedCalls.Tests.ps1 b/Diagnostics/HealthChecker/Tests/HealthChecker.MockedCalls.Tests.ps1 index 63ead49718..1e7e940c24 100644 --- a/Diagnostics/HealthChecker/Tests/HealthChecker.MockedCalls.Tests.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthChecker.MockedCalls.Tests.ps1 @@ -49,6 +49,8 @@ Describe "Testing Health Checker by Mock Data Imports" { Mock Get-OutlookAnywhere { return $null } Mock Get-PowerShellVirtualDirectory { return $null } Mock Get-WindowsFeature { return Import-Clixml "$Script:MockDataCollectionRoot\OS\GetWindowsFeature.xml" } + Mock Get-GlobalMonitoringOverride { return $null } + Mock Get-ServerMonitoringOverride { return $null } $Error.Clear() Get-OrganizationInformation -EdgeServer $false | Out-Null @@ -106,6 +108,8 @@ Describe "Testing Health Checker by Mock Data Imports" { Assert-MockCalled Get-OutlookAnywhere -Exactly 1 Assert-MockCalled Get-PowerShellVirtualDirectory -Exactly 1 Assert-MockCalled Get-WindowsFeature -Exactly 1 + Assert-MockCalled Get-GlobalMonitoringOverride -Exactly 1 + Assert-MockCalled Get-ServerMonitoringOverride -Exactly 1 } } } diff --git a/Diagnostics/HealthChecker/Tests/HealthCheckerTest.CommonMocks.NotPublished.ps1 b/Diagnostics/HealthChecker/Tests/HealthCheckerTest.CommonMocks.NotPublished.ps1 index cbcfa13eca..f1f48412b8 100644 --- a/Diagnostics/HealthChecker/Tests/HealthCheckerTest.CommonMocks.NotPublished.ps1 +++ b/Diagnostics/HealthChecker/Tests/HealthCheckerTest.CommonMocks.NotPublished.ps1 @@ -379,3 +379,11 @@ function Get-ExchangeWebSitesFromAd { function Get-WindowsFeature { return Import-Clixml "$Script:MockDataCollectionRoot\OS\GetWindowsFeature.xml" } + +function Get-GlobalMonitoringOverride { + return $null +} + +function Get-ServerMonitoringOverride { + return $null +} diff --git a/PublicFolders/SourceSideValidations/SourceSideValidations.ps1 b/PublicFolders/SourceSideValidations/SourceSideValidations.ps1 index 6cd3ff45de..ee205398f1 100644 --- a/PublicFolders/SourceSideValidations/SourceSideValidations.ps1 +++ b/PublicFolders/SourceSideValidations/SourceSideValidations.ps1 @@ -44,6 +44,7 @@ param ( . $PSScriptRoot\JobQueue.ps1 . $PSScriptRoot\..\..\Shared\ScriptUpdateFunctions\Test-ScriptVersion.ps1 . $PSScriptRoot\..\..\Shared\Out-Columns.ps1 +. $PSScriptRoot\..\..\Shared\Confirm-ExchangeShell.ps1 # For HashSet support Add-Type -AssemblyName System.Core -ErrorAction Stop @@ -92,6 +93,15 @@ try { } if ($RemoveInvalidPermissions) { + $shell = Confirm-ExchangeShell + + if (-not $shell.EMS) { + Write-Host "The -RemoveInvalidPermissions switch must be used from Exchange Management Shell. If you are using EMS," + Write-Host "then there may be an issue with the Auth Certificate or some other issue preventing PowerShell serialization." + Write-Host "Cannot continue." + return + } + if (-not (Test-Path $ResultsFile)) { Write-Error "File not found: $ResultsFile. Please specify -ResultsFile or run without -RemoveInvalidPermissions to generate a results file." } else { diff --git a/PublicFolders/SourceSideValidations/Tests/Permission/Remove-InvalidPermission.ps1 b/PublicFolders/SourceSideValidations/Tests/Permission/Remove-InvalidPermission.ps1 index 7b1b59f144..ac4edcfde4 100644 --- a/PublicFolders/SourceSideValidations/Tests/Permission/Remove-InvalidPermission.ps1 +++ b/PublicFolders/SourceSideValidations/Tests/Permission/Remove-InvalidPermission.ps1 @@ -48,7 +48,7 @@ function Remove-InvalidPermission { ) { if ($PSCmdlet.ShouldProcess("$($result.FolderIdentity)", "Remove $($perm.User.DisplayName)")) { Write-Host "Removing $($perm.User.DisplayName) from folder $($result.FolderIdentity)" - Remove-PublicFolderClientPermission $result.FolderEntryId -User $perm.User.DisplayName -Confirm:$false + $perm | Remove-PublicFolderClientPermission -Confirm:$false } } } diff --git a/Setup/SetupAssist/Checks/Domain/Test-ValidHomeMdb.ps1 b/Setup/SetupAssist/Checks/Domain/Test-ValidHomeMdb.ps1 deleted file mode 100644 index fe601ec2a7..0000000000 --- a/Setup/SetupAssist/Checks/Domain/Test-ValidHomeMdb.ps1 +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -. $PSScriptRoot\..\New-TestResult.ps1 -. $PSScriptRoot\..\..\..\..\Shared\ActiveDirectoryFunctions\Search-AllActiveDirectoryDomains.ps1 - -function Test-ValidHomeMDB { - $testName = "Valid Home MDB" - $arbitration = 0x800000 - $discovery = 0x20000000 - $publicFolder = 0x1000000000 - $recipientTypes = $arbitration -bor $discovery -bor $publicFolder - $filter = "(&(objectClass=user)(mailNickname=*)(msExchRecipientTypeDetails:1.2.840.113556.1.4.804:=$recipientTypes))" - $propsToLoad = @("distinguishedName", "homeMDB") - - $results = Search-AllActiveDirectoryDomains -Filter $filter -PropertiesToLoad $propsToLoad - - if ($null -ne $results -and - $results.Count -gt 0) { - - foreach ($result in $results) { - $dbName = $result.Properties["homeMDB"] - $params = @{ - TestName = $testName - Details = ("Mailbox DN: $($result.Properties["distinguishedName"])`n" + - "Database DN: $dbName") - ReferenceInfo = ("Run the following command in EMS.`n" + - "If EMS is down, launch PowerShell and run `"Add-PSSnapin *Exchange*`"`n" + - " Set-Mailbox 'DN' -Database 'DB_Name'") - } - - if ((-not([string]::IsNullOrEmpty($dbName))) -and - ([ADSI]::Exists("LDAP://$dbName"))) { - New-TestResult @params -Result "Passed" - } else { - New-TestResult @params -Result "Failed" - } - } - } else { - New-TestResult -TestName $testName -Result "Failed" -Details "Failed to find any critical mailboxes" - } -} diff --git a/Setup/SetupAssist/Checks/Domain/Test-ValidMailboxProperties.ps1 b/Setup/SetupAssist/Checks/Domain/Test-ValidMailboxProperties.ps1 new file mode 100644 index 0000000000..08b05aa232 --- /dev/null +++ b/Setup/SetupAssist/Checks/Domain/Test-ValidMailboxProperties.ps1 @@ -0,0 +1,63 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +. $PSScriptRoot\..\New-TestResult.ps1 +. $PSScriptRoot\..\..\..\..\Shared\ActiveDirectoryFunctions\Search-AllActiveDirectoryDomains.ps1 + +function Test-ValidMailboxProperties { + $validHomeMdbTestName = "Valid Home MDB" # Need to make sure the property value homeMDB is not null and points to a valid database object. + $validHomeServerTestName = "Valid Home Server Name" # Need to make sure the property value msExchHomeServerName is not null. + $arbitration = 0x800000 + $discovery = 0x20000000 + $publicFolder = 0x1000000000 + $recipientTypes = $arbitration -bor $discovery -bor $publicFolder + $filter = "(&(objectClass=user)(mailNickname=*)(msExchRecipientTypeDetails:1.2.840.113556.1.4.804:=$recipientTypes))" + $propsToLoad = @("distinguishedName", "homeMDB", "msExchHomeServerName") + + $results = Search-AllActiveDirectoryDomains -Filter $filter -PropertiesToLoad $propsToLoad + + if ($null -ne $results -and + $results.Count -gt 0) { + + foreach ($result in $results) { + $dbName = $result.Properties["homeMDB"] + $mailboxDN = $result.Properties["distinguishedName"] + $params = @{ + TestName = $validHomeMdbTestName + Details = ("Mailbox DN: $mailboxDN`n" + + "Database DN: $dbName") + ReferenceInfo = ("Run the following command in EMS.`n" + + "If EMS is down, launch PowerShell and run `"Add-PSSnapin *Exchange*`"`n" + + " Set-Mailbox 'DN' -Database 'DB_Name'") + } + + if ((-not([string]::IsNullOrEmpty($dbName))) -and + ([ADSI]::Exists("LDAP://$dbName"))) { + New-TestResult @params -Result "Passed" + } else { + New-TestResult @params -Result "Failed" + } + + $homeServer = $result.Properties["msExchHomeServerName"] + $params = @{ + TestName = $validHomeServerTestName + Details = ("Mailbox DN: $mailboxDN`nHome Server Name: $homeServer") + ReferenceInfo = ("Run the following command in PowerShell or EMS.`n" + + "Set-ADObject 'DN' -Add @{msExchHomeServerName='AnExchangeServer-ExchangeLegacyDN-Value'}") + } + + if ((-not([string]::IsNullOrEmpty($homeServer)))) { + New-TestResult @params -Result "Passed" + } else { + New-TestResult @params -Result "Failed" + } + } + } else { + $params = @{ + Result = "Failed" + Details = "Failed to find any critical mailboxes" + } + New-TestResult @params -TestName $validHomeMdbTestName + New-TestResult @params -TestName $validHomeServerTestName + } +} diff --git a/Setup/SetupAssist/SetupAssist.ps1 b/Setup/SetupAssist/SetupAssist.ps1 index 9bef82dcd1..70b0397f71 100644 --- a/Setup/SetupAssist/SetupAssist.ps1 +++ b/Setup/SetupAssist/SetupAssist.ps1 @@ -16,7 +16,7 @@ param( . $PSScriptRoot\Checks\Domain\Test-DomainMultiActiveSyncVirtualDirectories.ps1 . $PSScriptRoot\Checks\Domain\Test-ExchangeADSetupLevel.ps1 . $PSScriptRoot\Checks\Domain\Test-DomainOtherWellKnownObjects.ps1 -. $PSScriptRoot\Checks\Domain\Test-ValidHomeMdb.ps1 +. $PSScriptRoot\Checks\Domain\Test-ValidMailboxProperties.ps1 . $PSScriptRoot\Checks\LocalServer\Test-ExecutionPolicy.ps1 . $PSScriptRoot\Checks\LocalServer\Test-ExchangeServices.ps1 . $PSScriptRoot\Checks\LocalServer\Test-InstallWatermark.ps1 @@ -56,7 +56,7 @@ function RunAllTests { "Test-PrerequisiteInstalled", "Test-DomainOtherWellKnownObjects", "Test-PendingReboot", - "Test-ValidHomeMDB", + "Test-ValidMailboxProperties", "Test-VirtualDirectoryConfiguration") foreach ($test in $tests) { diff --git a/Shared/Get-MonitoringOverride.ps1 b/Shared/Get-MonitoringOverride.ps1 new file mode 100644 index 0000000000..8f5c7fd6c4 --- /dev/null +++ b/Shared/Get-MonitoringOverride.ps1 @@ -0,0 +1,64 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +function Get-MonitoringOverride { + [CmdletBinding()] + [OutputType([System.Collections.Generic.List[object]])] + param( + # If Server is provided, then we are doing Get-ServerMonitoringOverride. Otherwise, we are doing Get-GlobalMonitoringOverride. + [Parameter(Mandatory = $false)] + [string]$Server, + + [Parameter(Mandatory = $false)] + [ScriptBlock]$CatchActionFunction + ) + process { + try { + $monitoringOverrides = New-Object System.Collections.Generic.List[object] + $monitoringOverridesSimple = New-Object System.Collections.Generic.List[object] + $globalMonitoringOverride = [string]::IsNullOrEmpty($Server) + if ($globalMonitoringOverride) { + $monitoringOverride = Get-GlobalMonitoringOverride -ErrorAction Stop + } else { + $monitoringOverride = Get-ServerMonitoringOverride -Server $Server -ErrorAction Stop + } + + foreach ($override in $monitoringOverride) { + $monitoringOverrides.Add([PSCustomObject]@{ + ItemType = $override.ItemType + PropertyName = $override.PropertyName + PropertyValue = $override.PropertyValue + HealthSetName = $override.MonitoringItemName + TargetResource = $override.TargetResource + ExpirationTime = $override.ExpirationTime + ApplyVersion = $override.ApplyVersion + CreatedBy = $override.CreatedBy + CreatedTime = $override.CreatedTime + Identity = $override.Identity + IsValid = $override.IsValid + }) + $monitoringOverridesSimple.Add([PSCustomObject]@{ + Identity = $override.Identity + ItemType = $override.ItemType + PropertyName = $override.PropertyName + PropertyValue = $override.PropertyValue + ApplyVersion = $override.ApplyVersion + IsValid = $override.IsValid + IsGlobal = $globalMonitoringOverride + ExpirationTime = $override.ExpirationTime + }) + } + return [PSCustomObject]@{ + MonitoringOverrides = $monitoringOverrides + SimpleView = $monitoringOverridesSimple + } + } catch { + + Write-Verbose "Failed to get the monitoring override. Inner Exception $_" + + if ($null -ne $CatchActionFunction) { + & $CatchActionFunction + } + } + } +} diff --git a/Shared/ScriptUpdateFunctions/Invoke-ScriptUpdate.ps1 b/Shared/ScriptUpdateFunctions/Invoke-ScriptUpdate.ps1 index 12680975b5..9d5c0fce5d 100644 --- a/Shared/ScriptUpdateFunctions/Invoke-ScriptUpdate.ps1 +++ b/Shared/ScriptUpdateFunctions/Invoke-ScriptUpdate.ps1 @@ -28,7 +28,7 @@ function Invoke-ScriptUpdate { $oldName = [IO.Path]::GetFileNameWithoutExtension($scriptName) + ".old" $oldFullName = (Join-Path $scriptPath $oldName) - $tempFullName = (Join-Path $env:TEMP $scriptName) + $tempFullName = (Join-Path ((Get-Item $env:TEMP).FullName) $scriptName) if ($PSCmdlet.ShouldProcess("$scriptName", "Update script to latest version")) { try { diff --git a/docs/Diagnostics/ExchangeLogCollector.md b/docs/Diagnostics/ExchangeLogCollector.md index 2e4c8682d8..4d5022d1af 100644 --- a/docs/Diagnostics/ExchangeLogCollector.md +++ b/docs/Diagnostics/ExchangeLogCollector.md @@ -70,10 +70,12 @@ AppSysLogs | Collects the Windows Event Application, System, and MSExchange Mana AppSysLogsToXml | Collects the Windows Event Application and System and saves them out to XML. The time range only is from the time the script run and the value set on `LogAge`. Default value: `$true` AutoDLogs | Enable to collect AutoDiscover Logs. Location: `V15\Logging\Autodiscover` and `V15\Logging\HttpProxy\Autodiscover` CollectFailoverMetrics | Enable to run the `CollectOverMetrics.ps1` script against the DAG. Only able to be run on an Exchange tools box or an Exchange Server. +ConversationLogs | Enable to collect the Conversation Logs. Location: `V15\Logging\ConversationAggregationLog` and `V15\Logging\ConversationProcessingLog` DAGInformation | Enable to collect the DAG Information from all different DAGs that are in the list of servers. DailyPerformanceLogs | Enable to collect Daily Performance Logs. Default Location: `V15\Logging\Diagnostics\DailyPerformanceLogs` EASLogs | Enable to collect Exchange Active Sync Logging. Location: `V15\Logging\HttpProxy\Eas` ECPLogs | Enable to collect ECP Logs. Location: `V15\Logging\ECP` and `V15\Logging\HttpProxy\Ecp` +EventBasedAssistantsLogs | Enable to collect Event Based Assistants Logs. Location: `V15\Logging\EventBasedAssistants` and `V15\Logging\EventBasedAssistantsCollection` EWSLogs | Enable to collect EWS Logs. Location: `V15\Logging\HttpProxy\Ews` and `V15\Logging\Ews` ExchangeServerInformation | Enable to collect Exchange Information like Get-ExchangeServer, Get-MailboxServer, etc... This is also collected when `-ServerInformation` is also enabled. ExMon | Enable to collect ExMon data from the server. diff --git a/docs/Emerging-Issues.md b/docs/Emerging-Issues.md index b105f2cd02..0c17dd48e6 100644 --- a/docs/Emerging-Issues.md +++ b/docs/Emerging-Issues.md @@ -9,7 +9,7 @@ This page lists emerging issues for Exchange On-Premises deployments, possible r |**Updated on**|**Update causing the issue**|**Issue**|**Workaround/Solution**| |-|-|-|-| -| 8/23/2024 | [August 2024 update for Windows](https://support.microsoft.com/kb/5041578) | After installing the [August 2024 update for Windows](https://support.microsoft.com/kb/5041578), MS Exchange Transport service may start crashing | Please follow steps in [this KB](https://learn.microsoft.com/windows/release-health/status-windows-10-1809-and-windows-server-2019#3375msgdesc) | +| 9/11/2024 | [August 2024 update for Windows](https://support.microsoft.com/kb/5041578) | After installing the [August 2024 update for Windows](https://support.microsoft.com/kb/5041578)

1) Microsoft Exchange Transport service may start crashing
2) Microsoft Filtering Management Service may not start or start with long delay | **Update on 9/11/2024**

Install [Windows Update for September 2024](https://support.microsoft.com/topic/september-10-2024-kb5043050-os-build-17763-6293-66e9809a-1838-4474-a6a7-90d64f042f00) or later

**Old information**
Please follow steps in [this KB](https://learn.microsoft.com/windows/release-health/status-windows-10-1809-and-windows-server-2019#3375msgdesc) | | 4/23/2024 | [March 2024 Security Update for Exchange 2019,2016](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-march-2024-exchange-server-security-updates/ba-p/4075348) | After installing the [March 2024 Security Update]((https://techcommunity.microsoft.com/t5/exchange-team-blog/released-march-2024-exchange-server-security-updates/ba-p/4075348)), Search in Outlook (cached mode) may show "We're having trouble fetching results from the server...". The search works fine in OWA or Outlook online mode. | Please install [April 2024 Hotfix Update](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-april-2024-exchange-server-hotfix-updates/ba-p/4120536) | | 4/23/2024 | [March 2024 Security Update for Exchange 2019,2016](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-march-2024-exchange-server-security-updates/ba-p/4075348) | After installing the Security Update, add-ins may stop working with following error

"Add-in Error Something went wrong and we couldn't start this add-in. Please try again later or contact your system administrator | Please install [April 2024 Hotfix Update](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-april-2024-exchange-server-hotfix-updates/ba-p/4120536) | | 4/23/2024 | [March 2024 Security Update for Exchange 2019,2016](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-march-2024-exchange-server-security-updates/ba-p/4075348) |After installing the March 2024 Security Update, Unread envelope icon is not getting updated after applying March 2024 SU | Please install [April 2024 Hotfix Update](https://techcommunity.microsoft.com/t5/exchange-team-blog/released-april-2024-exchange-server-hotfix-updates/ba-p/4120536) |