From 6a66a81b7858106286002d789abca735746b3f10 Mon Sep 17 00:00:00 2001 From: Nik Charlebois Date: Mon, 27 Jan 2025 15:24:30 -0500 Subject: [PATCH] Centralized export logic for CimInstances --- CHANGELOG.md | 25 ++ .../MSFT_AADAdminConsentRequestPolicy.psm1 | 26 +- ...enantAccessPolicyConfigurationDefault.psm1 | 194 +++++++++++++-- ...enantAccessPolicyConfigurationPartner.psm1 | 227 +++++++++++++++--- .../MSFT_AADGroup/MSFT_AADGroup.psm1 | 24 +- .../MSFT_AADHomeRealmDiscoveryPolicy.psm1 | 27 ++- ...ADIdentityGovernanceLifecycleWorkflow.psm1 | 64 ++++- ...MSFT_AADNetworkAccessForwardingPolicy.psm1 | 23 +- ...SFT_AADNetworkAccessForwardingProfile.psm1 | 29 ++- .../MSFT_AADRemoteNetwork.psm1 | 46 +++- ...MSFT_AADRoleAssignmentScheduleRequest.psm1 | 69 +++++- .../MSFT_TeamsEmergencyCallRoutingPolicy.psm1 | 24 +- .../MSFT_TeamsTenantDialPlan.psm1 | 28 ++- .../Modules/M365DSCDRGUtil.psm1 | 41 +++- 14 files changed, 754 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 328bbddb56..c21b432c10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,29 @@ # UNRELEASED +* AADAdminConsentRequestPolicy + * Refactored the export to use a common CIMInstance function. +* AADCrossTenantAccessPolicyConfigurationDefault + * Refactored the export to use a common CIMInstance function. +* AADCrossTenantAccessPolicyConfigurationPartner + * Refactored the export to use a common CIMInstance function. +* AADGroup + * Refactored the export to use a common CIMInstance function. +* AADHomeRealmDiscoveryPolicy + * Refactored the export to use a common CIMInstance function. +* AADIdentityGovernanceLifecycleWorkflow + * Refactored the export to use a common CIMInstance function. +* AADNetworkAccessForwardingPolicy + * Refactored the export to use a common CIMInstance function. +* AADNetworkAccessForwardingProfile + * Refactored the export to use a common CIMInstance function. +* AADRemoteNetwork + * Refactored the export to use a common CIMInstance function. +* AADRoleAssignmentScheduleRequest + * Refactored the export to use a common CIMInstance function. * AADRoleEligibilityScheduleRequest * Fixed overall logic to prevent errors complaining about existing permissions. + * Refactored the export to use a common CIMInstance function. * FabricAdminTenantSettings * Fix titles that have a zero length whitespace character. * IntuneAppProtectionPolicyAndroid @@ -27,6 +48,10 @@ * O365SearchAndIntelligenceConfigurations * Added support for Meeting Insights settings. * Added support for Service Principal authentication. +* TeamsEmergencyCallRoutingPolicy + * Refactored the export to use a common CIMInstance function. +* TeamsTenantDialPlan + * Refactored the export to use a common CIMInstance function. # 1.25.122.1 diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADAdminConsentRequestPolicy/MSFT_AADAdminConsentRequestPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADAdminConsentRequestPolicy/MSFT_AADAdminConsentRequestPolicy.psm1 index b03afb5728..db857d353c 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADAdminConsentRequestPolicy/MSFT_AADAdminConsentRequestPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADAdminConsentRequestPolicy/MSFT_AADAdminConsentRequestPolicy.psm1 @@ -468,9 +468,28 @@ function Export-TargetResource $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - if ($Results.Reviewers.Count -gt 0) + if ($null -ne $Results.Reviewers) { - $Results.Reviewers = Get-M365DSCAzureADAAdminConsentPolicyReviewerAsString $Results.Reviewers + $complexMapping = @( + @{ + Name = 'Reviewers' + CimInstanceName = 'AADAdminConsentRequestPolicyReviewer' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.Reviewers ` + -CIMInstanceName 'AADAdminConsentRequestPolicyReviewer' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.Reviewers = $complexTypeStringResult + } + else + { + $Results.Remove('Reviewers') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -478,10 +497,9 @@ function Export-TargetResource -ModulePath $PSScriptRoot ` -Results $Results ` -Credential $Credential - if ($Results.Reviewers) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'Reviewers' -IsCIMArray:$true + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'Reviewers' -IsCIMArray:$True } $dscContent += $currentDSCBlock Save-M365DSCPartialExport -Content $currentDSCBlock ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationDefault/MSFT_AADCrossTenantAccessPolicyConfigurationDefault.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationDefault/MSFT_AADCrossTenantAccessPolicyConfigurationDefault.psm1 index 161a160feb..2d92b4d4bc 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationDefault/MSFT_AADCrossTenantAccessPolicyConfigurationDefault.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationDefault/MSFT_AADCrossTenantAccessPolicyConfigurationDefault.psm1 @@ -472,23 +472,182 @@ function Export-TargetResource if ($null -ne $Results.B2BCollaborationInbound) { - $Results.B2BCollaborationInbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BCollaborationInbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BCollaborationInbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BCollaborationInbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BCollaborationInbound') | Out-Null + } } + if ($null -ne $Results.B2BCollaborationOutbound) { - $Results.B2BCollaborationOutbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BCollaborationOutbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BCollaborationOutbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BCollaborationOutbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BCollaborationOutbound') | Out-Null + } } + if ($null -ne $Results.B2BDirectConnectInbound) { - $Results.B2BDirectConnectInbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BDirectConnectInbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BDirectConnectInbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BDirectConnectInbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BDirectConnectInbound') | Out-Null + } } + if ($null -ne $Results.B2BDirectConnectOutbound) { - $Results.B2BDirectConnectOutbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BDirectConnectOutbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BDirectConnectOutbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BDirectConnectOutbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BDirectConnectOutbound') | Out-Null + } } + if ($null -ne $Results.InboundTrust) { - $Results.InboundTrust = Get-M365DSCAADCrossTenantAccessPolicyInboundTrustAsString -Setting $Results.InboundTrust + $complexMapping = @( + @{ + Name = 'InboundTrust' + CimInstanceName = 'AADCrossTenantAccessPolicyInboundTrust' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.InboundTrust ` + -CIMInstanceName 'AADCrossTenantAccessPolicyInboundTrust' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.InboundTrust = $complexTypeStringResult + } + else + { + $Results.Remove('InboundTrust') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -497,30 +656,25 @@ function Export-TargetResource -Results $Results ` -Credential $Credential - if ($null -ne $Results.B2BCollaborationInbound) + if ($Results.B2BCollaborationInbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BCollaborationInbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BCollaborationInbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BCollaborationOutbound) + if ($Results.B2BCollaborationOutbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BCollaborationOutbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BCollaborationOutbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BDirectConnectInbound) + if ($Results.B2BDirectConnectInbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BDirectConnectInbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BDirectConnectInbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BDirectConnectOutbound) + if ($Results.B2BDirectConnectOutbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BDirectConnectOutbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BDirectConnectOutbound' -IsCIMArray:$True } - if ($null -ne $Results.InboundTrust) + if ($Results.InboundTrust) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'InboundTrust' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'InboundTrust' -IsCIMArray:$True } # Fix OrganizationName variable in CIMInstance diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationPartner/MSFT_AADCrossTenantAccessPolicyConfigurationPartner.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationPartner/MSFT_AADCrossTenantAccessPolicyConfigurationPartner.psm1 index ef0bd66662..24290899c3 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationPartner/MSFT_AADCrossTenantAccessPolicyConfigurationPartner.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADCrossTenantAccessPolicyConfigurationPartner/MSFT_AADCrossTenantAccessPolicyConfigurationPartner.psm1 @@ -507,27 +507,206 @@ function Export-TargetResource if ($null -ne $Results.B2BCollaborationInbound) { - $Results.B2BCollaborationInbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BCollaborationInbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BCollaborationInbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BCollaborationInbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BCollaborationInbound') | Out-Null + } } + + if ($null -ne $Results.AutomaticUserConsentSettings) + { + $complexMapping = @( + @{ + Name = 'AutomaticUserConsentSettings' + CimInstanceName = 'AADCrossTenantAccessPolicyAutomaticUserConsentSettings' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.AutomaticUserConsentSettings ` + -CIMInstanceName 'AADCrossTenantAccessPolicyAutomaticUserConsentSettings' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.AutomaticUserConsentSettings = $complexTypeStringResult + } + else + { + $Results.Remove('AutomaticUserConsentSettings') | Out-Null + } + } + if ($null -ne $Results.B2BCollaborationOutbound) { - $Results.B2BCollaborationOutbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BCollaborationOutbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BCollaborationOutbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BCollaborationOutbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BCollaborationOutbound') | Out-Null + } } + if ($null -ne $Results.B2BDirectConnectInbound) { - $Results.B2BDirectConnectInbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BDirectConnectInbound + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BDirectConnectInbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BDirectConnectInbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BDirectConnectInbound') | Out-Null + } } + if ($null -ne $Results.B2BDirectConnectOutbound) { - $Results.B2BDirectConnectOutbound = Get-M365DSCAADCrossTenantAccessPolicyB2BSettingAsString -Setting $Results.B2BDirectConnectOutbound - } - if ($null -ne $Results.AutomaticUserConsentSettings) - { - $Results.AutomaticUserConsentSettings = Get-M365DSCAADCrossTenantAccessPolicyAutomaticUserConsentSettingsAsString -Setting $Results.AutomaticUserConsentSettings + $complexMapping = @( + @{ + Name = 'B2BCollaborationInbound' + CimInstanceName = 'AADCrossTenantAccessPolicyB2BSetting' + IsRequired = $False + }, + @{ + Name = 'Applications' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'UsersAndGroups' + CimInstanceName = 'AADCrossTenantAccessPolicyTargetConfiguration' + IsRequired = $False + }, + @{ + Name = 'Targets' + CimInstanceName = 'AADCrossTenantAccessPolicyTarget' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.B2BDirectConnectOutbound ` + -CIMInstanceName 'AADCrossTenantAccessPolicyB2BSetting' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.B2BDirectConnectOutbound = $complexTypeStringResult + } + else + { + $Results.Remove('B2BDirectConnectOutbound') | Out-Null + } } + if ($null -ne $Results.InboundTrust) { - $Results.InboundTrust = Get-M365DSCAADCrossTenantAccessPolicyInboundTrustAsString -Setting $Results.InboundTrust + $complexMapping = @( + @{ + Name = 'InboundTrust' + CimInstanceName = 'AADCrossTenantAccessPolicyInboundTrust' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.InboundTrust ` + -CIMInstanceName 'AADCrossTenantAccessPolicyInboundTrust' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.InboundTrust = $complexTypeStringResult + } + else + { + $Results.Remove('InboundTrust') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -536,35 +715,29 @@ function Export-TargetResource -Results $Results ` -Credential $Credential - if ($null -ne $Results.B2BCollaborationInbound) + if ($Results.B2BCollaborationInbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BCollaborationInbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BCollaborationInbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BCollaborationOutbound) + if ($Results.B2BCollaborationOutbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BCollaborationOutbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BCollaborationOutbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BDirectConnectInbound) + if ($Results.B2BDirectConnectInbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BDirectConnectInbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BDirectConnectInbound' -IsCIMArray:$True } - if ($null -ne $Results.B2BDirectConnectOutbound) + if ($Results.B2BDirectConnectOutbound) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'B2BDirectConnectOutbound' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'B2BDirectConnectOutbound' -IsCIMArray:$True } - if ($null -ne $Results.AutomaticUserConsentSettings) + if ($Results.InboundTrust) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'AutomaticUserConsentSettings' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'InboundTrust' -IsCIMArray:$True } - if ($null -ne $Results.InboundTrust) + if ($Results.AutomaticUserConsentSettings) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'InboundTrust' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'AutomaticUserConsentSettings' -IsCIMArray:$True } # Fix OrganizationName variable in CIMInstance diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADGroup/MSFT_AADGroup.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADGroup/MSFT_AADGroup.psm1 index 9d0cf188b7..e45596b8c3 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADGroup/MSFT_AADGroup.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADGroup/MSFT_AADGroup.psm1 @@ -1308,9 +1308,29 @@ function Export-TargetResource $Results = Get-TargetResource @Params $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - if ($results.AssignedLicenses.Length -gt 0) + + if ($null -ne $Results.AssignedLicenses) { - $Results.AssignedLicenses = Get-M365DSCAzureADGroupLicensesAsString $Results.AssignedLicenses + $complexMapping = @( + @{ + Name = 'AssignedLicenses' + CimInstanceName = 'AADGroupLicense' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.AssignedLicenses ` + -CIMInstanceName 'AADGroupLicense' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.AssignedLicenses = $complexTypeStringResult + } + else + { + $Results.Remove('AssignedLicenses') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` -ConnectionMode $ConnectionMode ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADHomeRealmDiscoveryPolicy/MSFT_AADHomeRealmDiscoveryPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADHomeRealmDiscoveryPolicy/MSFT_AADHomeRealmDiscoveryPolicy.psm1 index 75f731e717..504559fd21 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADHomeRealmDiscoveryPolicy/MSFT_AADHomeRealmDiscoveryPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADHomeRealmDiscoveryPolicy/MSFT_AADHomeRealmDiscoveryPolicy.psm1 @@ -500,9 +500,32 @@ function Export-TargetResource if ($null -ne $Results.Definition) { - $Results.Definition = Get-M365DSCAADHomeRealDiscoveryPolicyDefinitionAsString $Results.Definition + $complexMapping = @( + @{ + Name = 'Definition' + CimInstanceName = 'AADHomeRealDiscoveryPolicyDefinition' + IsRequired = $False + }, + @{ + Name = 'AlternateIdLogin' + CimInstanceName = 'AADHomeRealDiscoveryPolicyDefinitionAlternateIdLogin' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.Definition ` + -CIMInstanceName 'AADHomeRealDiscoveryPolicyDefinition' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.Definition = $complexTypeStringResult + } + else + { + $Results.Remove('Definition') | Out-Null + } } - $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` -ConnectionMode $ConnectionMode ` -ModulePath $PSScriptRoot ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADIdentityGovernanceLifecycleWorkflow/MSFT_AADIdentityGovernanceLifecycleWorkflow.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADIdentityGovernanceLifecycleWorkflow/MSFT_AADIdentityGovernanceLifecycleWorkflow.psm1 index d9ed004b04..c82aa75e96 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADIdentityGovernanceLifecycleWorkflow/MSFT_AADIdentityGovernanceLifecycleWorkflow.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADIdentityGovernanceLifecycleWorkflow/MSFT_AADIdentityGovernanceLifecycleWorkflow.psm1 @@ -526,12 +526,65 @@ function Export-TargetResource if ($null -ne $Results.Tasks) { - $Results.Tasks = Get-M365DSCIdentityGovernanceTasksAsString $Results.Tasks + $complexMapping = @( + @{ + Name = 'Tasks' + CimInstanceName = 'AADIdentityGovernanceTask' + IsRequired = $False + }, + @{ + Name = 'Arguments' + CimInstanceName = 'MSFT_AADIdentityGovernanceTaskArguments' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.Tasks ` + -CIMInstanceName 'AADIdentityGovernanceTask' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.Tasks = $complexTypeStringResult + } + else + { + $Results.Remove('Tasks') | Out-Null + } } if ($null -ne $Results.ExecutionConditions) { - $Results.ExecutionConditions = Get-M365DSCIdentityGovernanceWorkflowExecutionConditionsAsString $Results.ExecutionConditions + $complexMapping = @( + @{ + Name = 'ExecutionConditions' + CimInstanceName = 'MSFT_IdentityGovernanceWorkflowExecutionConditions' + IsRequired = $False + }, + @{ + Name = 'ScopeValue' + CimInstanceName = 'MSFT_IdentityGovernanceScope' + IsRequired = $False + }, + @{ + Name = 'TriggerValue' + CimInstanceName = 'MSFT_IdentityGovernanceTrigger' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.ExecutionConditions ` + -CIMInstanceName 'MSFT_IdentityGovernanceWorkflowExecutionConditions' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.ExecutionConditions = $complexTypeStringResult + } + else + { + $Results.Remove('ExecutionConditions') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -542,9 +595,12 @@ function Export-TargetResource if ($null -ne $Results.Tasks) { $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'Tasks' + -ParameterName 'Tasks' -IsCIMArray:$true + } + if ($null -ne $Results.ExecutionConditions) + { $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'ExecutionConditions' + -ParameterName 'ExecutionConditions' -IsCIMArray:$true } $dscContent += $currentDSCBlock Save-M365DSCPartialExport -Content $currentDSCBlock ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingPolicy/MSFT_AADNetworkAccessForwardingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingPolicy/MSFT_AADNetworkAccessForwardingPolicy.psm1 index 60713f2585..da66361c5d 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingPolicy/MSFT_AADNetworkAccessForwardingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingPolicy/MSFT_AADNetworkAccessForwardingPolicy.psm1 @@ -420,7 +420,26 @@ function Export-TargetResource if ($null -ne $Results.PolicyRules) { - $Results.PolicyRules = Get-MicrosoftGraphNetworkAccessForwardingPolicyRulesAsString -PolicyRules $Results.PolicyRules + $complexMapping = @( + @{ + Name = 'PolicyRules' + CimInstanceName = 'MicrosoftGraphNetworkAccessForwardingPolicyRule' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.PolicyRules ` + -CIMInstanceName 'MicrosoftGraphNetworkAccessForwardingPolicyRule' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.PolicyRules = $complexTypeStringResult + } + else + { + $Results.Remove('PolicyRules') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -432,7 +451,7 @@ function Export-TargetResource if ($null -ne $Results.PolicyRules) { $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'PolicyRules' + -ParameterName 'PolicyRules' -IsCIMArray:$true } $dscContent += $currentDSCBlock diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingProfile/MSFT_AADNetworkAccessForwardingProfile.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingProfile/MSFT_AADNetworkAccessForwardingProfile.psm1 index a1e6c27217..2d7839aa2d 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingProfile/MSFT_AADNetworkAccessForwardingProfile.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADNetworkAccessForwardingProfile/MSFT_AADNetworkAccessForwardingProfile.psm1 @@ -447,6 +447,10 @@ function Export-TargetResource } foreach ($config in $getValue) { + if ($null -ne $Global:M365DSCExportResourceInstancesCount) + { + $Global:M365DSCExportResourceInstancesCount++ + } $displayedKey = $config.Id if (-not [string]::IsNullOrEmpty($config.name)) { @@ -469,9 +473,28 @@ function Export-TargetResource $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - if ($Results.Policies.Count -gt 0) + if ($null -ne $Results.Policies) { - $Results.Policies = Get-PoliciesAsString $Results.Policies + $complexMapping = @( + @{ + Name = 'Policies' + CimInstanceName = 'MicrosoftGraphNetworkaccessPolicyLink' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.Policies ` + -CIMInstanceName 'MicrosoftGraphNetworkaccessPolicyLink' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.Policies = $complexTypeStringResult + } + else + { + $Results.Remove('Policies') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -483,7 +506,7 @@ function Export-TargetResource if ($null -ne $Results.Policies) { $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock ` - -ParameterName 'Policies' + -ParameterName 'Policies' -IsCIMArray:$true } $dscContent += $currentDSCBlock Save-M365DSCPartialExport -Content $currentDSCBlock ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADRemoteNetwork/MSFT_AADRemoteNetwork.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADRemoteNetwork/MSFT_AADRemoteNetwork.psm1 index 09860c448d..5d34df3e37 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADRemoteNetwork/MSFT_AADRemoteNetwork.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADRemoteNetwork/MSFT_AADRemoteNetwork.psm1 @@ -486,6 +486,10 @@ function Export-TargetResource } foreach ($config in $getValue) { + if ($null -ne $Global:M365DSCExportResourceInstancesCount) + { + $Global:M365DSCExportResourceInstancesCount++ + } $displayedKey = $config.Id if (-not [String]::IsNullOrEmpty($config.Name)) { @@ -513,9 +517,43 @@ function Export-TargetResource $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - if ($null -ne $Results.DeviceLinks -and $Results.DeviceLinks.Count -gt 0) - { - $Results.DeviceLinks = Get-MicrosoftGraphRemoteNetworkDeviceLinksHashtableAsString -DeviceLinks $Results.DeviceLinks + if ($null -ne $Results.DeviceLinks) + { + $complexMapping = @( + @{ + Name = 'DeviceLinks' + CimInstanceName = 'AADRemoteNetworkDeviceLink' + IsRequired = $False + }, + @{ + Name = 'BgpConfiguration' + CimInstanceName = 'AADRemoteNetworkDeviceLinkbgpConfiguration' + IsRequired = $False + }, + @{ + Name = 'RedundancyConfiguration' + CimInstanceName = 'AADRemoteNetworkDeviceLinkRedundancyConfiguration' + IsRequired = $False + }, + @{ + Name = 'TunnelConfiguration' + CimInstanceName = 'AADRemoteNetworkDeviceLinkTunnelConfiguration' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.DeviceLinks ` + -CIMInstanceName 'AADRemoteNetworkDeviceLink' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.DeviceLinks = $complexTypeStringResult + } + else + { + $Results.Remove('DeviceLinks') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -526,7 +564,7 @@ function Export-TargetResource if ($Results.DeviceLinks) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'DeviceLinks' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'DeviceLinks' -IsCIMArray:$true } $dscContent += $currentDSCBlock diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_AADRoleAssignmentScheduleRequest/MSFT_AADRoleAssignmentScheduleRequest.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_AADRoleAssignmentScheduleRequest/MSFT_AADRoleAssignmentScheduleRequest.psm1 index 7c019e5dab..114e0c7d5a 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_AADRoleAssignmentScheduleRequest/MSFT_AADRoleAssignmentScheduleRequest.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_AADRoleAssignmentScheduleRequest/MSFT_AADRoleAssignmentScheduleRequest.psm1 @@ -804,20 +804,71 @@ function Export-TargetResource $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - try + if ($null -ne $Results.ScheduleInfo) { - if ($null -ne $results.ScheduleInfo) + $complexMapping = @( + @{ + Name = 'ScheduleInfo' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestSchedule' + IsRequired = $False + }, + @{ + Name = 'expiration' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestScheduleExpiration' + IsRequired = $False + }, + @{ + Name = 'recurrence' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestScheduleRecurrence' + IsRequired = $False + }, + @{ + Name = 'pattern' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestScheduleRecurrencePattern' + IsRequired = $False + }, + @{ + Name = 'range' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestScheduleRecurrenceRange' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.ScheduleInfo ` + -CIMInstanceName 'MSFT_AADRoleAssignmentScheduleRequestSchedule' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) { - $Results.ScheduleInfo = Get-M365DSCAzureADEligibilityRequestScheduleInfoAsString -ScheduleInfo $Results.ScheduleInfo + $Results.ScheduleInfo = $complexTypeStringResult + } + else + { + $Results.Remove('ScheduleInfo') | Out-Null } } - catch - { - Write-Verbose -Message "Error converting Schedule: $_" - } - if ($Results.TicketInfo) + if ($null -ne $Results.TicketInfo) { - $Results.TicketInfo = Get-M365DSCAzureADEligibilityRequestTicketInfoAsString -TicketInfo $Results.TicketInfo + $complexMapping = @( + @{ + Name = 'TicketInfo' + CimInstanceName = 'MSFT_AADRoleAssignmentScheduleRequestTicketInfo' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.TicketInfo ` + -CIMInstanceName 'MSFT_AADRoleAssignmentScheduleRequestTicketInfo' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.TicketInfo = $complexTypeStringResult + } + else + { + $Results.Remove('TicketInfo') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` -ConnectionMode $ConnectionMode ` diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsEmergencyCallRoutingPolicy/MSFT_TeamsEmergencyCallRoutingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsEmergencyCallRoutingPolicy/MSFT_TeamsEmergencyCallRoutingPolicy.psm1 index cb6af2fc54..3939367a25 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsEmergencyCallRoutingPolicy/MSFT_TeamsEmergencyCallRoutingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsEmergencyCallRoutingPolicy/MSFT_TeamsEmergencyCallRoutingPolicy.psm1 @@ -417,7 +417,25 @@ function Export-TargetResource if ($null -ne $result.EmergencyNumbers) { - $result.EmergencyNumbers = ConvertTo-TeamsEmergencyNumbersString -Numbers $result.EmergencyNumbers + $complexMapping = @( + @{ + Name = 'EmergencyNumbers' + CimInstanceName = 'TeamsEmergencyNumber' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $result.EmergencyNumbers ` + -CIMInstanceName 'TeamsEmergencyNumber' ` + -ComplexTypeMapping $complexMapping + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $result.EmergencyNumbers = $complexTypeStringResult + } + else + { + $result.Remove('EmergencyNumbers') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -426,9 +444,9 @@ function Export-TargetResource -Results $Result ` -Credential $Credential - if ($null -ne $result.EmergencyNumbers) + if ($Result.EmergencyNumbers) { - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'EmergencyNumbers' + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'EmergencyNumbers' -IsCIMArray:$True } $dscContent += $currentDSCBlock diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsTenantDialPlan/MSFT_TeamsTenantDialPlan.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsTenantDialPlan/MSFT_TeamsTenantDialPlan.psm1 index 929262de24..8b60186f45 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsTenantDialPlan/MSFT_TeamsTenantDialPlan.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsTenantDialPlan/MSFT_TeamsTenantDialPlan.psm1 @@ -527,9 +527,28 @@ function Export-TargetResource $results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results - if ($results.NormalizationRules.Count -gt 0) + if ($null -ne $Results.NormalizationRules) { - $results.NormalizationRules = Get-M365DSCNormalizationRulesAsString $results.NormalizationRules + $complexMapping = @( + @{ + Name = 'NormalizationRules' + CimInstanceName = 'TeamsVoiceNormalizationRule' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.NormalizationRules ` + -CIMInstanceName 'TeamsVoiceNormalizationRule' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.NormalizationRules = $complexTypeStringResult + } + else + { + $Results.Remove('NormalizationRules') | Out-Null + } } $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` @@ -537,8 +556,11 @@ function Export-TargetResource -ModulePath $PSScriptRoot ` -Results $Results ` -Credential $Credential + if ($Results.NormalizationRules) + { + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'NormalizationRules' -IsCIMArray:$True + } - $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'NormalizationRules' $dscContent += $currentDSCBlock Save-M365DSCPartialExport -Content $currentDSCBlock ` diff --git a/Modules/Microsoft365DSC/Modules/M365DSCDRGUtil.psm1 b/Modules/Microsoft365DSC/Modules/M365DSCDRGUtil.psm1 index 9c136ae97f..4f82942a31 100644 --- a/Modules/Microsoft365DSC/Modules/M365DSCDRGUtil.psm1 +++ b/Modules/Microsoft365DSC/Modules/M365DSCDRGUtil.psm1 @@ -325,22 +325,36 @@ function Get-M365DSCDRGComplexTypeToString $indent = ' ' * $IndentLevel $keyNotNull = 0 + $keys = $ComplexObject.Keys if ($ComplexObject.Keys.Count -eq 0) { - return $null + $properties = $ComplexObject | Get-Member -MemberType Properties + if ($null -eq $properties) + { + return $null + } + else + { + $keys = $properties.Name + } } - foreach ($key in $ComplexObject.Keys) + foreach ($key in $keys) { if ($null -ne $ComplexObject.$key) { $keyNotNull++ if ($ComplexObject.$key.GetType().FullName -like 'Microsoft.Graph.PowerShell.Models.*' -or $key -in $ComplexTypeMapping.Name) { - $hashPropertyType = $ComplexObject[$key].GetType().Name.ToLower() + $itemValue = $ComplexObject[$key] + if ([System.String]::IsNullOrEmpty($itemValue)) + { + $itemValue = $ComplexObject.$key + } + $hashPropertyType = $itemValue.GetType().Name.ToLower() $IsArray = $false - if ($ComplexObject[$key].GetType().FullName -like '*[[\]]') + if ($itemValue.GetType().FullName -like '*[[\]]') { $IsArray = $true } @@ -348,12 +362,12 @@ function Get-M365DSCDRGComplexTypeToString if ($key -in $ComplexTypeMapping.Name) { $hashPropertyType = ([Array]($ComplexTypeMapping | Where-Object -FilterScript { $_.Name -eq $key }).CimInstanceName)[0] - $hashProperty = $ComplexObject[$key] + $hashProperty = $itemValue #$currentProperty += "`r`n" } else { - $hashProperty = Get-M365DSCDRGComplexTypeToHashtable -ComplexObject $ComplexObject[$key] + $hashProperty = Get-M365DSCDRGComplexTypeToHashtable -ComplexObject $itemValue } if (-not $IsArray) @@ -373,7 +387,7 @@ function Get-M365DSCDRGComplexTypeToString if ($IsArray) { $IndentLevel++ - for ($i = 0; $i -lt $ComplexObject[$key].Count; $i++) + for ($i = 0; $i -lt $itemValue.Count; $i++) { $item = $ComplexObject.$key[$i] if ($ComplexObject.$key.GetType().FullName -like 'Microsoft.Graph.PowerShell.Models.*') @@ -427,11 +441,18 @@ function Get-M365DSCDRGComplexTypeToString else { $currentValue = $ComplexObject[$key] - if ($currentValue.GetType().Name -eq 'String') + if ([System.String]::IsNullOrEmpty($currentValue)) + { + $currentValue = $ComplexObject.$key + } + if (-not [System.String]::IsNullOrEmpty($currentValue) -and $currentValue.GetType().Name -ne 'Dictionary`2') { - $currentValue = $ComplexObject[$key].Replace("'", "''").Replace("�", "''") + if ($currentValue.GetType().Name -eq 'String') + { + $currentValue = $currentValue.Replace("'", "''").Replace("�", "''") + } + $currentProperty += Get-M365DSCDRGSimpleObjectTypeToString -Key $key -Value $currentValue -Space ($indent) } - $currentProperty += Get-M365DSCDRGSimpleObjectTypeToString -Key $key -Value $currentValue -Space ($indent) } } else