diff --git a/CHANGELOG.md b/CHANGELOG.md index fe71c76b71..ccb904dc54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change log for Microsoft365DSC +# 1.25.129.3 + +* EXOMigrationEndpoint + * Added support for EntpointType value of ExchangeRemoteMove. +* M365DSCRuleEvaluation + * Changed logic to evaluate cases where the rule results in no results. +* SPDLPComplianceRule + * Fix for the SensitiveInfoType ID cleaning logic in Get-TargetResource. +* DEPENDENCIES + * Updated Microsoft.PowerApps.Administration.PowerShell to version 2.0.205. + * Updated MicrosoftTeams to version 6.8.0. + * Updated MSCloudLoginAssistant to version 1.1.35. + # 1.25.129.2 * M365DSCRuleEvaluation diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.psm1 index 0890bcf4b8..56fdc880b0 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.psm1 @@ -25,7 +25,7 @@ function Get-TargetResource $Authentication, [Parameter()] - [ValidateSet('IMAP')] + [ValidateSet('IMAP', 'ExchangeRemoteMove')] [System.String] $EndpointType, @@ -208,7 +208,7 @@ function Set-TargetResource $Authentication, [Parameter()] - [ValidateSet('IMAP')] + [ValidateSet('IMAP', 'ExchangeRemoteMove')] [System.String] $EndpointType, @@ -305,14 +305,14 @@ function Set-TargetResource $currentInstance = Get-TargetResource @PSBoundParameters - $setParams = [System.Collections.Hashtable]($PSBoundParameters) + $setParams = ([Hashtable]$PSBoundParameters).Clone() $setParams = Remove-M365DSCAuthenticationParameter -BoundParameters $setParams $setParams.Remove('RemoteTenant') $setParams.Remove('EndpointType') $setParams.Remove('UseAutoDiscover') $setParams.Add('Confirm', $false) - $newParams = [System.Collections.Hashtable]($PSBoundParameters) + $newParams = ([Hashtable]$PSBoundParameters).Clone() $newParams = Remove-M365DSCAuthenticationParameter -BoundParameters $newParams $newParams.Remove('EndpointType') $newParams.Remove('Identity') @@ -332,22 +332,40 @@ function Set-TargetResource $newParams.Add('IMAP', [Switch]$true) } + elseif ($EndpointType -eq 'ExchangeRemoteMove') + { + # Removing mailbox permission parameter as this is valid only for outlook anywhere migration + $setParams.Remove('MailboxPermission') | Out-Null + $newParams.Remove('MailboxPermission') | Out-Null + $newParams.Remove("AcceptUntrustedCertificates") | Out-Null + $setParams.Remove("AcceptUntrustedCertificates") | Out-Null + + # adding skip verification switch to skip verifying + # that the remote server is reachable when creating a migration endpoint. + $setParams.Add('SkipVerification', [Switch]$true) + $newParams.Add('SkipVerification', [Switch]$true) + + $newParams.Add('ExchangeRemoteMove', [Switch]$true) + } # add the logic for other endpoint types ('Exchange Remote', 'Outlook Anywhere', 'Google Workspace') # CREATE if ($Ensure -eq 'Present' -and $currentInstance.Ensure -eq 'Absent') { + Write-Verbose -Message "Creating new migration endpoint with parameters:`r`n$(ConvertTo-Json $newParams -Depth 10)" New-MigrationEndpoint @newParams } # UPDATE elseif ($Ensure -eq 'Present' -and $currentInstance.Ensure -eq 'Present') { + Write-Verbose -Message "Updating migration endpoint with parameters:`r`n$(ConvertTo-Json $setParams -Depth 10)" Set-MigrationEndpoint @setParams } # REMOVE elseif ($Ensure -eq 'Absent' -and $currentInstance.Ensure -eq 'Present') { + Write-Verbose -Message "Removing migration endpoint with id {$Identity}" Remove-MigrationEndpoint -Identity $Identity } } @@ -379,7 +397,7 @@ function Test-TargetResource $Authentication, [Parameter()] - [ValidateSet('IMAP')] + [ValidateSet('IMAP', 'ExchangeRemoteMove')] [System.String] $EndpointType, diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.schema.mof b/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.schema.mof index 6f6e4c9692..ff38f57737 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.schema.mof +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_EXOMigrationEndpoint/MSFT_EXOMigrationEndpoint.schema.mof @@ -6,7 +6,7 @@ class MSFT_EXOMigrationEndpoint : OMI_BaseResource [Write, Description("The Application ID used for authentication.")] String AppID; [Write, Description("The URL of the Key Vault that stores the application secret.")] String AppSecretKeyVaultUrl; [Write, Description("The authentication method for the migration endpoint.")] String Authentication; - [Write, Description("The type of migration endpoint."), ValueMap{"IMAP"}, Values{"IMAP"}] String EndpointType; + [Write, Description("The type of migration endpoint."), ValueMap{"IMAP", "ExchangeRemoteMove"}, Values{"IMAP", "ExchangeRemoteMove"}] String EndpointType; [Write, Description("The Exchange Server address for the migration endpoint.")] String ExchangeServer; [Write, Description("The mailbox permission for the migration endpoint.")] String MailboxPermission; [Write, Description("The maximum number of concurrent incremental syncs.")] String MaxConcurrentIncrementalSyncs; diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_M365DSCRuleEvaluation/MSFT_M365DSCRuleEvaluation.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_M365DSCRuleEvaluation/MSFT_M365DSCRuleEvaluation.psm1 index 073de91c8e..e0b3ae74d1 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_M365DSCRuleEvaluation/MSFT_M365DSCRuleEvaluation.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_M365DSCRuleEvaluation/MSFT_M365DSCRuleEvaluation.psm1 @@ -252,48 +252,24 @@ function Test-TargetResource [void]$message.AppendLine(" $ResourceTypeName") [void]$message.AppendLine(" $RuleDefinition") - if ($instances.Length -eq 0) + if (-not [System.String]::IsNullOrEmpty($AfterRuleCountQuery)) { - [array]$invalidInstances = $DSCConvertedInstances.ResourceInstanceName - [void]$message.AppendLine(' ') - [void]$message.AppendLine(' ') - } - else - { - if (-not [System.String]::IsNullOrEmpty($AfterRuleCountQuery)) - { - [void]$message.AppendLine(' ') - [void]$message.AppendLine(" $AfterRuleCountQuery") + [void]$message.AppendLine(' ') + [void]$message.AppendLine(" $AfterRuleCountQuery") - Write-Verbose -Message 'Checking the After Rule Count Query' - $afterRuleCountQueryString = "`$instances.Length $AfterRuleCountQuery" - $afterRuleCountQueryBlock = [Scriptblock]::Create($afterRuleCountQueryString) - $result = [Boolean](Invoke-Command -ScriptBlock $afterRuleCountQueryBlock) - [array]$validInstances = $instances.ResourceInstanceName - [array]$invalidInstances = $DSCConvertedInstances.ResourceInstanceName | Where-Object -FilterScript { $_ -notin $validInstances } + Write-Verbose -Message 'Checking the After Rule Count Query' + $afterRuleCountQueryString = "`$instances.Length $AfterRuleCountQuery" + $afterRuleCountQueryBlock = [Scriptblock]::Create($afterRuleCountQueryString) + $result = [Boolean](Invoke-Command -ScriptBlock $afterRuleCountQueryBlock) + [array]$validInstances = $instances.ResourceInstanceName + [array]$invalidInstances = $DSCConvertedInstances.ResourceInstanceName | Where-Object -FilterScript { $_ -notin $validInstances } - if (-not $result) - { - [void]$message.AppendLine(' False') - [void]$message.AppendLine(' ') - if ($validInstances.Count -gt 0) - { - [void]$message.AppendLine(' ') - foreach ($validInstance in $validInstances) - { - [void]$message.AppendLine(" [$ResourceTypeName]$validInstance") - } - [void]$message.AppendLine(' ') - } - else - { - [void]$message.AppendLine(' ') - } - } - else + if (-not $result) + { + [void]$message.AppendLine(' False') + [void]$message.AppendLine(' ') + if ($validInstances.Count -gt 0) { - [void]$message.AppendLine(' True') - [void]$message.AppendLine(' ') [void]$message.AppendLine(' ') foreach ($validInstance in $validInstances) { @@ -301,37 +277,56 @@ function Test-TargetResource } [void]$message.AppendLine(' ') } + else + { + [void]$message.AppendLine(' ') + } } else { - [void]$message.AppendLine(' ') - - $compareInstances = @() - $compareInstances += Compare-Object -ReferenceObject $DSCConvertedInstances.ResourceInstanceName -DifferenceObject $instances.ResourceInstanceName -IncludeEqual - if ($compareInstances.Count -gt 0) + [void]$message.AppendLine(' True') + [void]$message.AppendLine(' ') + [void]$message.AppendLine(' ') + foreach ($validInstance in $validInstances) { - [array]$validInstances = $($compareInstances | Where-Object -FilterScript { $_.SideIndicator -eq '==' }).InputObject - [array]$invalidInstances = $($compareInstances | Where-Object -FilterScript { $_.SideIndicator -eq '<=' }).InputObject - } - else - { - [array]$validInstances = @() - [array]$invalidInstances = [array]$DSCConvertedInstances.ResourceInstanceName + [void]$message.AppendLine(" [$ResourceTypeName]$validInstance") } + [void]$message.AppendLine(' ') + } + } + else + { + [void]$message.AppendLine(' ') - if ($validInstances.Count -gt 0) - { - [void]$message.AppendLine(' ') - foreach ($validInstance in $validInstances) - { - [void]$message.AppendLine(" [$ResourceTypeName]$validInstance") - } - [void]$message.AppendLine(' ') - } - else + $compareInstances = @() + if ($DSCConvertedInstances.Length -gt 0) + { + $compareInstances += Compare-Object -ReferenceObject $DSCConvertedInstances.ResourceInstanceName -DifferenceObject $instances.ResourceInstanceName -IncludeEqual + } + + if ($compareInstances.Count -gt 0) + { + [array]$validInstances = $($compareInstances | Where-Object -FilterScript { $_.SideIndicator -eq '==' }).InputObject + [array]$invalidInstances = $($compareInstances | Where-Object -FilterScript { $_.SideIndicator -eq '<=' }).InputObject + } + else + { + [array]$validInstances = @() + [array]$invalidInstances = [array]$DSCConvertedInstances.ResourceInstanceName + } + + if ($validInstances.Count -gt 0) + { + [void]$message.AppendLine(' ') + foreach ($validInstance in $validInstances) { - [void]$message.AppendLine(' ') + [void]$message.AppendLine(" [$ResourceTypeName]$validInstance") } + [void]$message.AppendLine(' ') + } + else + { + [void]$message.AppendLine(' ') } } diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_SCDLPComplianceRule/MSFT_SCDLPComplianceRule.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_SCDLPComplianceRule/MSFT_SCDLPComplianceRule.psm1 index 10e2159cb7..1d16bbf1b8 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_SCDLPComplianceRule/MSFT_SCDLPComplianceRule.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_SCDLPComplianceRule/MSFT_SCDLPComplianceRule.psm1 @@ -408,7 +408,14 @@ function Get-TargetResource } elseif ($null -ne $ruleObject.Condition.SubConditions[$index].Value.Groups.Sensitivetypes) { - $ruleobject.Condition.SubConditions[$index].Value.Groups.Sensitivetypes = @($ruleobject.Condition.SubConditions[$index].Value.Groups.Sensitivetypes | Select-Object * -ExcludeProperty Id) + $sensitiveTypesValue = $ruleobject.Condition.SubConditions[$index].Value.Groups.Sensitivetypes + foreach ($stype in $sensitiveTypesValue) + { + if ($null -ne $stype.Id) + { + $stype.Id = $null + } + } } } @@ -924,7 +931,7 @@ function Set-TargetResource $CreationParams.Remove('AccessTokens') | Out-Null Write-Verbose -Message "Calling New-DLPComplianceRule with Values: $(Convert-M365DscHashtableToString -Hashtable $CreationParams)" - New-DLPComplianceRule @CreationParams + New-DLPComplianceRule @CreationParams -Confirm:$false } elseif (('Present' -eq $Ensure) -and ('Present' -eq $CurrentRule.Ensure)) { @@ -991,7 +998,7 @@ function Set-TargetResource $UpdateParams.Remove('AccessTokens') | Out-Null Write-Verbose "Updating Rule with values: $(Convert-M365DscHashtableToString -Hashtable $UpdateParams)" - Set-DLPComplianceRule @UpdateParams + Set-DLPComplianceRule @UpdateParams -Confirm:$false } elseif (('Absent' -eq $Ensure) -and ('Present' -eq $CurrentRule.Ensure)) { diff --git a/Modules/Microsoft365DSC/Dependencies/Manifest.psd1 b/Modules/Microsoft365DSC/Dependencies/Manifest.psd1 index 9e0c178a3d..b8b8009b49 100644 --- a/Modules/Microsoft365DSC/Dependencies/Manifest.psd1 +++ b/Modules/Microsoft365DSC/Dependencies/Manifest.psd1 @@ -114,15 +114,15 @@ }, @{ ModuleName = 'Microsoft.PowerApps.Administration.PowerShell' - RequiredVersion = '2.0.203' + RequiredVersion = '2.0.205' }, @{ ModuleName = 'MicrosoftTeams' - RequiredVersion = '6.7.0' + RequiredVersion = '6.8.0' }, @{ ModuleName = "MSCloudLoginAssistant" - RequiredVersion = "1.1.34" + RequiredVersion = "1.1.35" }, @{ ModuleName = 'PnP.PowerShell' diff --git a/Modules/Microsoft365DSC/Microsoft365DSC.psd1 b/Modules/Microsoft365DSC/Microsoft365DSC.psd1 index c45663f9e2..2ca6216f5a 100644 --- a/Modules/Microsoft365DSC/Microsoft365DSC.psd1 +++ b/Modules/Microsoft365DSC/Microsoft365DSC.psd1 @@ -3,7 +3,7 @@ # # Generated by: Microsoft Corporation # -# Generated on: 2025-01-29 +# Generated on: 2025-01-31 @{ @@ -11,7 +11,7 @@ # RootModule = '' # Version number of this module. - ModuleVersion = '1.25.129.2' + ModuleVersion = '1.25.129.3' # Supported PSEditions # CompatiblePSEditions = @() @@ -147,13 +147,16 @@ IconUri = 'https://github.com/microsoft/Microsoft365DSC/blob/Dev/Modules/Microsoft365DSC/Dependencies/Images/Logo.png?raw=true' # ReleaseNotes of this module - ReleaseNotes = '* M365DSCRuleEvaluation - * Only provide the ManagedIdentity parameter for resources which supports it. -* SCDLPComplianceRule - * Added the comments property on creation. -* SCPolicyConfig - * Changed parsing logic to account for $null or missing properties in the - API response.' + ReleaseNotes = '* EXOMigrationEndpoint + * Added support for EntpointType value of ExchangeRemoteMove. +* M365DSCRuleEvaluation + * Changed logic to evaluate cases where the rule results in no results. +* SPDLPComplianceRule + * Fix for the SensitiveInfoType ID cleaning logic in Get-TargetResource. +* DEPENDENCIES + * Updated Microsoft.PowerApps.Administration.PowerShell to version 2.0.205. + * Updated MicrosoftTeams to version 6.8.0. + * Updated MSCloudLoginAssistant to version 1.1.35.' # Flag to indicate whether the module requires explicit user acceptance for install/update # RequireLicenseAcceptance = $false