From 18e8ddf25a509bee94008a23596df6c5d5a1bac6 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Tue, 26 Sep 2023 15:41:09 +0200 Subject: [PATCH 01/10] fix ComplianceRecordingApplications --- .../MSFT_TeamsComplianceRecordingPolicy.psm1 | 57 +++++++++++++++++-- ..._TeamsComplianceRecordingPolicy.schema.mof | 14 ++++- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 index 707422b878..7b8e9393d1 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 @@ -9,7 +9,7 @@ function Get-TargetResource $Identity, [Parameter()] - [System.String[]] + [Microsoft.Management.Infrastructure.CimInstance] $ComplianceRecordingApplications, [Parameter()] @@ -75,10 +75,28 @@ function Get-TargetResource return $nullResult } + if($instance.ComplianceRecordingApplications.Count -gt 0){ + $ComplexComplianceRecordingApplications = @() + foreach($CurrentComplianceRecordingApplications in $instance.ComplianceRecordingApplications){ + $MyComplianceRecordingApplications = @{} + $MyComplianceRecordingApplications.Add('ComplianceRecordingPairedApplications', $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) + $MyComplianceRecordingApplications.Add('Id', $CurrentComplianceRecordingApplications.Id) + $MyComplianceRecordingApplications.Add('RequiredBeforeMeetingJoin', $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin) + $MyComplianceRecordingApplications.Add('RequiredBeforeCallEstablishment', $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment) + $MyComplianceRecordingApplications.Add('RequiredDuringMeeting', $CurrentComplianceRecordingApplications.RequiredDuringMeeting) + $MyComplianceRecordingApplications.Add('RequiredDuringCall', $CurrentComplianceRecordingApplications.RequiredDuringCall) + $MyComplianceRecordingApplications.Add('ConcurrentInvitationCount', $CurrentComplianceRecordingApplications.ConcurrentInvitationCount) + + if ($MyComplianceRecordingApplications.values.Where({$null -ne $_}).count -gt 0){ + $ComplexComplianceRecordingApplications += $MyComplianceRecordingApplications + } + } + } + Write-Verbose -Message "Found an instance with Identity {$Identity}" $results = @{ Identity = $instance.Identity - ComplianceRecordingApplications = $instance.ComplianceRecordingApplications + ComplianceRecordingApplications = $ComplexComplianceRecordingApplications Description = $instance.Description DisableComplianceRecordingAudioNotificationForCalls = $instance.DisableComplianceRecordingAudioNotificationForCalls Enabled = $instance.Enabled @@ -113,7 +131,7 @@ function Set-TargetResource $Identity, [Parameter()] - [System.String[]] + [Microsoft.Management.Infrastructure.CimInstance] $ComplianceRecordingApplications, [Parameter()] @@ -236,7 +254,7 @@ function Test-TargetResource $Identity, [Parameter()] - [System.String[]] + [Microsoft.Management.Infrastructure.CimInstance] $ComplianceRecordingApplications, [Parameter()] @@ -406,11 +424,42 @@ function Export-TargetResource $Results = Update-M365DSCExportAuthenticationResults -ConnectionMode $ConnectionMode ` -Results $Results + if ($null -ne $Results.ComplianceRecordingApplications) + { + $complexMapping = @( + @{ + Name = 'ComplianceRecordingApplications' + CimInstanceName = 'Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication' + IsRequired = $False + } + ) + $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` + -ComplexObject $Results.ComplianceRecordingApplications ` + -CIMInstanceName 'Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication' ` + -ComplexTypeMapping $complexMapping + + if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) + { + $Results.ComplianceRecordingApplications = $complexTypeStringResult + } + else + { + $Results.Remove('ComplianceRecordingApplications') | Out-Null + } + } + $currentDSCBlock = Get-M365DSCExportContentForResource -ResourceName $ResourceName ` -ConnectionMode $ConnectionMode ` -ModulePath $PSScriptRoot ` -Results $Results ` -Credential $Credential + if ($Results.ComplianceRecordingApplications) + { + $currentDSCBlock = Convert-DSCStringParamToVariable -DSCBlock $currentDSCBlock -ParameterName 'ComplianceRecordingApplications' -IsCIMArray:$True + $currentDSCBlock = $currentDSCBlock.Replace('ComplianceRecordingApplications = @("', 'ComplianceRecordingApplications = @(') + $currentDSCBlock = $currentDSCBlock.Replace(" `",`"`r`n", '') + + } $dscContent += $currentDSCBlock Save-M365DSCPartialExport -Content $currentDSCBlock ` -FileName $Global:PartialExportFileName diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof index 25f29236af..4a9e214fd4 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof @@ -1,8 +1,20 @@ +[ClassVersion("0.0.96.0"), FriendlyName("TeamsComplianceRecordingApplication)] +class MSFT_Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication +{ + [Write, Description("")] String Id; + [Write, Description("")] String[] ComplianceRecordingPairedApplications; + [Write, Description("")] Boolean RequiredBeforeMeetingJoin; + [Write, Description("")] Boolean RequiredBeforeCallEstablishment; + [Write, Description("")] Boolean RequiredDuringMeeting; + [Write, Description("")] Boolean RequiredDuringCall; + [Write, Description("")] String ConcurrentInvitationCount; +} + [ClassVersion("1.0.0.0"), FriendlyName("TeamsComplianceRecordingPolicy")] class MSFT_TeamsComplianceRecordingPolicy : OMI_BaseResource { [Key, Description("Unique identifier of the application instance of a policy-based recording application to be retrieved.")] String Identity; - [Write, Description("A list of application instances of policy-based recording applications to assign to this policy. The Id of each of these application instances must be the ObjectId of the application instance as obtained by the Get-CsOnlineApplicationInstance cmdlet.")] String ComplianceRecordingApplications[]; + [Write, Description("A list of application instances of policy-based recording applications to assign to this policy. The Id of each of these application instances must be the ObjectId of the application instance as obtained by the Get-CsOnlineApplicationInstance cmdlet."), EmbeddedInstance("MSFT_Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication")] String ComplianceRecordingApplications[]; [Write, Description("Enables administrators to provide explanatory text to accompany a Teams recording policy. For example, the Description might include information about the users the policy should be assigned to.")] String Description; [Write, Description("Setting this attribute to true disables recording audio notifications for 1:1 calls that are under compliance recording.")] Boolean DisableComplianceRecordingAudioNotificationForCalls; [Write, Description("Controls whether this Teams recording policy is active or not.")] Boolean Enabled; From 691e5d6fad6b6fedabda99dbfe15012974093e61 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Tue, 26 Sep 2023 16:03:26 +0200 Subject: [PATCH 02/10] wip --- .../MSFT_TeamsComplianceRecordingPolicy.psm1 | 4 ++-- .../MSFT_TeamsComplianceRecordingPolicy.schema.mof | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 index 7b8e9393d1..b834a3a86d 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 @@ -429,13 +429,13 @@ function Export-TargetResource $complexMapping = @( @{ Name = 'ComplianceRecordingApplications' - CimInstanceName = 'Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication' + CimInstanceName = 'TeamsComplianceRecordingApplication' IsRequired = $False } ) $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` -ComplexObject $Results.ComplianceRecordingApplications ` - -CIMInstanceName 'Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication' ` + -CIMInstanceName 'TeamsComplianceRecordingApplicationn' ` -ComplexTypeMapping $complexMapping if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof index 4a9e214fd4..b14ba1eb62 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("0.0.96.0"), FriendlyName("TeamsComplianceRecordingApplication)] -class MSFT_Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication +[ClassVersion("1.0.0"), FriendlyName("TeamsComplianceRecordingApplication)] +class MSFT_TeamsComplianceRecordingApplication { [Write, Description("")] String Id; [Write, Description("")] String[] ComplianceRecordingPairedApplications; @@ -14,7 +14,7 @@ class MSFT_Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordin class MSFT_TeamsComplianceRecordingPolicy : OMI_BaseResource { [Key, Description("Unique identifier of the application instance of a policy-based recording application to be retrieved.")] String Identity; - [Write, Description("A list of application instances of policy-based recording applications to assign to this policy. The Id of each of these application instances must be the ObjectId of the application instance as obtained by the Get-CsOnlineApplicationInstance cmdlet."), EmbeddedInstance("MSFT_Microsoft.Teams.Policy.Administration.Cmdlets.Core.ComplianceRecordingApplication")] String ComplianceRecordingApplications[]; + [Write, Description("A list of application instances of policy-based recording applications to assign to this policy. The Id of each of these application instances must be the ObjectId of the application instance as obtained by the Get-CsOnlineApplicationInstance cmdlet."), EmbeddedInstance("MSFT_TeamsComplianceRecordingApplication")] String ComplianceRecordingApplications[]; [Write, Description("Enables administrators to provide explanatory text to accompany a Teams recording policy. For example, the Description might include information about the users the policy should be assigned to.")] String Description; [Write, Description("Setting this attribute to true disables recording audio notifications for 1:1 calls that are under compliance recording.")] Boolean DisableComplianceRecordingAudioNotificationForCalls; [Write, Description("Controls whether this Teams recording policy is active or not.")] Boolean Enabled; From 1f46e89abc6c9ad2dbacb8a56658e264e6fcf17e Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Wed, 4 Oct 2023 18:52:10 +0200 Subject: [PATCH 03/10] Fixes MSFT_TeamsComplianceRecordingPolicy attribute not exported correctly #3712 --- .../MSFT_TeamsComplianceRecordingPolicy.psm1 | 132 ++++++++++++++++-- ..._TeamsComplianceRecordingPolicy.schema.mof | 18 +-- 2 files changed, 132 insertions(+), 18 deletions(-) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 index b834a3a86d..cfe3cbc9b8 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 @@ -9,7 +9,7 @@ function Get-TargetResource $Identity, [Parameter()] - [Microsoft.Management.Infrastructure.CimInstance] + [Microsoft.Management.Infrastructure.CimInstance[]] $ComplianceRecordingApplications, [Parameter()] @@ -79,7 +79,13 @@ function Get-TargetResource $ComplexComplianceRecordingApplications = @() foreach($CurrentComplianceRecordingApplications in $instance.ComplianceRecordingApplications){ $MyComplianceRecordingApplications = @{} - $MyComplianceRecordingApplications.Add('ComplianceRecordingPairedApplications', $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) + $ComplianceRecordingPairedApplications = @() + if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ + foreach($CurrentComplianceRecordingPairedApplications in $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications){ + $ComplianceRecordingPairedApplications += $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Id + } + } + $MyComplianceRecordingApplications.Add('ComplianceRecordingPairedApplications', $ComplianceRecordingPairedApplications) $MyComplianceRecordingApplications.Add('Id', $CurrentComplianceRecordingApplications.Id) $MyComplianceRecordingApplications.Add('RequiredBeforeMeetingJoin', $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin) $MyComplianceRecordingApplications.Add('RequiredBeforeCallEstablishment', $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment) @@ -131,7 +137,7 @@ function Set-TargetResource $Identity, [Parameter()] - [Microsoft.Management.Infrastructure.CimInstance] + [Microsoft.Management.Infrastructure.CimInstance[]] $ComplianceRecordingApplications, [Parameter()] @@ -215,6 +221,47 @@ function Set-TargetResource } Write-Verbose -Message "Creating {$Identity} with Parameters:`r`n$(Convert-M365DscHashtableToString -Hashtable $CreateParameters)" New-CsTeamsComplianceRecordingPolicy @CreateParameters | Out-Null + + if($ComplianceRecordingApplications.Count -gt 0){ + foreach($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications){ + $Instance = $CurrentComplianceRecordingApplications.Id + $RequiredBeforeMeetingJoin = $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin + $RequiredBeforeCallEstablishment = $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment + $RequiredDuringMeeting = $CurrentComplianceRecordingApplications.RequiredDuringMeeting + $RequiredDuringCall = $CurrentComplianceRecordingApplications.RequiredDuringCall + $ConcurrentInvitationCount = $CurrentComplianceRecordingApplications.ConcurrentInvitationCount + + $CsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ErrorAction SilentlyContinue + if($null -eq $CsTeamsComplianceRecordingApplication){ + New-CsTeamsComplianceRecordingApplication ` + -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` + -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` + -RequiredDuringMeeting $RequiredDuringMeeting ` + -RequiredDuringCall $RequiredDuringCall ` + -ConcurrentInvitationCount $ConcurrentInvitationCount ` + -Parent $Identity -Id $Instance + } + else{ + Set-CsTeamsComplianceRecordingApplication ` + -Identity $CsTeamsComplianceRecordingApplicationIdentity ` + -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` + -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` + -RequiredDuringMeeting $RequiredDuringMeeting ` + -RequiredDuringCall $RequiredDuringCall ` + -ConcurrentInvitationCount $ConcurrentInvitationCount + } + + if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ + Set-CsTeamsComplianceRecordingApplication ` + -Identity "$Identity + '/' + $Instance" ` + -ComplianceRecordingPairedApplications @(New-CsTeamsComplianceRecordingPairedApplication ` + -Id $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) + } + } + $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object{$_.Identity -match $Identity} + Set-CsTeamsComplianceRecordingPolicy -Identity $Identity -ComplianceRecordingApplications $NewCsTeamsComplianceRecordingApplication + } + } elseif ($Ensure -eq 'Present' -and $currentInstance.Ensure -eq 'Present') { @@ -235,6 +282,46 @@ function Set-TargetResource } Set-CsTeamsComplianceRecordingPolicy @UpdateParameters | Out-Null + if($ComplianceRecordingApplications.Count -gt 0){ + foreach($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications){ + $Instance = $CurrentComplianceRecordingApplications.Id + $RequiredBeforeMeetingJoin = $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin + $RequiredBeforeCallEstablishment = $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment + $RequiredDuringMeeting = $CurrentComplianceRecordingApplications.RequiredDuringMeeting + $RequiredDuringCall = $CurrentComplianceRecordingApplications.RequiredDuringCall + $ConcurrentInvitationCount = $CurrentComplianceRecordingApplications.ConcurrentInvitationCount + + $CsTeamsComplianceRecordingApplicationIdentity = $Identity + '/' + $Instance + + $CsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ErrorAction SilentlyContinue + if($null -eq $CsTeamsComplianceRecordingApplication){ + New-CsTeamsComplianceRecordingApplication ` + -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` + -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` + -RequiredDuringMeeting $RequiredDuringMeeting ` + -RequiredDuringCall $RequiredDuringCall ` + -ConcurrentInvitationCount $ConcurrentInvitationCount ` + -Parent $Identity -Id $Instance + } + else{ + Set-CsTeamsComplianceRecordingApplication ` + -Identity $CsTeamsComplianceRecordingApplicationIdentity ` + -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` + -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` + -RequiredDuringMeeting $RequiredDuringMeeting ` + -RequiredDuringCall $RequiredDuringCall ` + -ConcurrentInvitationCount $ConcurrentInvitationCount + } + + if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ + [string]$CsTeamsComplianceRecordingApplicationIdentity = $Identity + '/' + $Instance + [string]$ComplianceRecordingPairedApplications = $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications + Set-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ComplianceRecordingPairedApplications @(New-CsTeamsComplianceRecordingPairedApplication -Id $ComplianceRecordingPairedApplications) + } + } + $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object{$_.Identity -match $Identity} + Set-CsTeamsComplianceRecordingPolicy -Identity $Identity -ComplianceRecordingApplications $NewCsTeamsComplianceRecordingApplication + } } elseif ($Ensure -eq 'Absent' -and $currentInstance.Ensure -eq 'Present') { @@ -254,7 +341,7 @@ function Test-TargetResource $Identity, [Parameter()] - [Microsoft.Management.Infrastructure.CimInstance] + [Microsoft.Management.Infrastructure.CimInstance[]] $ComplianceRecordingApplications, [Parameter()] @@ -318,6 +405,30 @@ function Test-TargetResource Write-Verbose -Message "Test-TargetResource returned $false" return $false } + $testResult = $true + + #Compare Cim instances + foreach ($key in $PSBoundParameters.Keys) + { + $source = $PSBoundParameters.$key + $target = $CurrentValues.$key + if ($source.getType().Name -like '*CimInstance*') + { + $source = Get-M365DSCDRGComplexTypeToHashtable -ComplexObject $source + + $testResult = Compare-M365DSCComplexObject ` + -Source ($source) ` + -Target ($target) + + if (-Not $testResult) + { + $testResult = $false + break + } + + $ValuesToCheck.Remove($key) | Out-Null + } + } Write-Verbose -Message "Current Values: $(Convert-M365DscHashtableToString -Hashtable $CurrentValues)" Write-Verbose -Message "Target Values: $(Convert-M365DscHashtableToString -Hashtable $ValuesToCheck)" @@ -332,10 +443,13 @@ function Test-TargetResource } } - $testResult = Test-M365DSCParameterState -CurrentValues $CurrentValues ` - -Source $($MyInvocation.MyCommand.Source) ` - -DesiredValues $PSBoundParameters ` - -ValuesToCheck $ValuesToCheck.Keys + if ($testResult) + { + $testResult = Test-M365DSCParameterState -CurrentValues $CurrentValues ` + -Source $($MyInvocation.MyCommand.Source) ` + -DesiredValues $PSBoundParameters ` + -ValuesToCheck $ValuesToCheck.Keys + } Write-Verbose -Message "Test-TargetResource returned $testResult" @@ -435,7 +549,7 @@ function Export-TargetResource ) $complexTypeStringResult = Get-M365DSCDRGComplexTypeToString ` -ComplexObject $Results.ComplianceRecordingApplications ` - -CIMInstanceName 'TeamsComplianceRecordingApplicationn' ` + -CIMInstanceName 'TeamsComplianceRecordingApplication' ` -ComplexTypeMapping $complexMapping if (-Not [String]::IsNullOrWhiteSpace($complexTypeStringResult)) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof index b14ba1eb62..89c9dab78f 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.schema.mof @@ -1,14 +1,14 @@ -[ClassVersion("1.0.0"), FriendlyName("TeamsComplianceRecordingApplication)] +[ClassVersion("1.0.0")] class MSFT_TeamsComplianceRecordingApplication { - [Write, Description("")] String Id; - [Write, Description("")] String[] ComplianceRecordingPairedApplications; - [Write, Description("")] Boolean RequiredBeforeMeetingJoin; - [Write, Description("")] Boolean RequiredBeforeCallEstablishment; - [Write, Description("")] Boolean RequiredDuringMeeting; - [Write, Description("")] Boolean RequiredDuringCall; - [Write, Description("")] String ConcurrentInvitationCount; -} + [Write, Description("A name that uniquely identifies the application instance of the policy-based recording application.")] String Id; + [Write, Description("Determines the other policy-based recording applications to pair with this application to achieve application resiliency. Can only have one paired application.")] String ComplianceRecordingPairedApplications[]; + [Write, Description("Indicates whether the policy-based recording application must be in the meeting before the user is allowed to join the meeting.")] Boolean RequiredBeforeMeetingJoin; + [Write, Description("Indicates whether the policy-based recording application must be in the call before the call is allowed to establish.")] Boolean RequiredBeforeCallEstablishment; + [Write, Description("Indicates whether the policy-based recording application must be in the meeting while the user is in the meeting.")] Boolean RequiredDuringMeeting; + [Write, Description("Indicates whether the policy-based recording application must be in the call while the call is active.")] Boolean RequiredDuringCall; + [Write, Description("Determines the number of invites to send out to the application instance of the policy-based recording application. Can be set to 1 or 2 only.")] String ConcurrentInvitationCount; +}; [ClassVersion("1.0.0.0"), FriendlyName("TeamsComplianceRecordingPolicy")] class MSFT_TeamsComplianceRecordingPolicy : OMI_BaseResource From 0d08b7d8481807adb839909a0f9c563dcb2fe437 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Wed, 4 Oct 2023 19:39:08 +0200 Subject: [PATCH 04/10] Add Tests --- .../MSFT_TeamsComplianceRecordingPolicy.psm1 | 1 + .../Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 index cfe3cbc9b8..0e322f505f 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 @@ -214,6 +214,7 @@ function Set-TargetResource { if ($null -ne $CreateParameters.$key -and $CreateParameters.$key.GetType().Name -like '*cimInstance*') { + $keyName = $key.substring(0, 1).ToLower() + $key.substring(1, $key.length - 1) $keyValue = Convert-M365DSCDRGComplexTypeToHashtable -ComplexObject $CreateParameters.$key $CreateParameters.Remove($key) | Out-Null $CreateParameters.Add($keyName, $keyValue) diff --git a/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 b/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 index 5883bcdf14..9941104d95 100644 --- a/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 +++ b/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 @@ -63,7 +63,6 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = 'FakeStringValue' Identity = 'FakeStringValue' Ensure = 'Present' Credential = $Credential @@ -166,7 +165,6 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = 'FakeStringValue' Identity = 'FakeStringValue' Ensure = 'Present' Credential = $Credential From 5556bfe77933b6f909e90a8c5e4a7222c6cb083a Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Wed, 4 Oct 2023 19:42:58 +0200 Subject: [PATCH 05/10] Add Example --- ...TeamsComplianceRecordingPolicy-Example.ps1 | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 b/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 index 0e67e0222e..cb7abd3b03 100644 --- a/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 +++ b/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 @@ -14,15 +14,34 @@ Configuration Example node localhost { - TeamsComplianceRecordingPolicy 'Example' + TeamsComplianceRecordingPolicy "TeamsComplianceRecordingPolicy-Tag:MyTeamsComplianceRecordingPolicy" { - ComplianceRecordingApplications = @(); - Credential = $Credscredential; + Credential = $credsCredential; + ComplianceRecordingApplications = @( + MSFT_TeamsComplianceRecordingApplication{ + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @('00000000-0000-0000-0000-000000000000') + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + MSFT_TeamsComplianceRecordingApplication{ + Id = '12345678-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @('87654321-0000-0000-0000-000000000000') + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + ); + Description = "MyTeamsComplianceRecordingPolicy"; DisableComplianceRecordingAudioNotificationForCalls = $False; - Enabled = $False; + Enabled = $True; Ensure = "Present"; - Identity = "Global"; + Identity = "Tag:MyTeamsComplianceRecordingPolicy"; WarnUserOnRemoval = $True; } - } } From 4aedebbb2dbb149f74873ddfc46edb0f3cba2ac5 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Wed, 4 Oct 2023 19:47:02 +0200 Subject: [PATCH 06/10] Add Entry in ChangeLog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3a79deed..f2d69fdabf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change log for Microsoft365DSC +# UNRELEASED + +* TeamsComplianceREcordingPolicy + * FIXES [[#3712](https://github.com/microsoft/Microsoft365DSC/issues/3712)] + # 1.23.1004.1 * AADEntitlementManagementAccessPackageAssignmentPolicy From 5f6a23df3e4344031dc03beb4a6c448ef4f46a36 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Wed, 11 Oct 2023 15:10:24 +0200 Subject: [PATCH 07/10] Fix example file --- .../1-TeamsComplianceRecordingPolicy-Example.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 b/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 index cb7abd3b03..70e5823572 100644 --- a/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 +++ b/Modules/Microsoft365DSC/Examples/Resources/TeamsComplianceRecordingPolicy/1-TeamsComplianceRecordingPolicy-Example.ps1 @@ -44,4 +44,5 @@ Configuration Example Identity = "Tag:MyTeamsComplianceRecordingPolicy"; WarnUserOnRemoval = $True; } + } } From 8e59d4e34612fdcb57ac875e40c93068b1babffd Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Fri, 17 Nov 2023 08:40:21 +0100 Subject: [PATCH 08/10] Correct formatting --- CHANGELOG.md | 4 +- .../MSFT_TeamsComplianceRecordingPolicy.psm1 | 55 ++++++++++++------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dff0c353f9..164cc2115c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,6 @@ # UNRELEASED -* TeamsComplianceREcordingPolicy - * FIXES [[#3712](https://github.com/microsoft/Microsoft365DSC/issues/3712)] * AADRoleEligibilityScheduleRequest * Added support for groups assignment. FIXES [#3744](https://github.com/microsoft/Microsoft365DSC/issues/3744) @@ -16,6 +14,8 @@ * MISC * M365DSCReport: Also define property dataType, if present, as being primary key on CIM instances. +* TeamsComplianceREcordingPolicy + * FIXES [[#3712](https://github.com/microsoft/Microsoft365DSC/issues/3712)] * TeamsUpgradeConfiguration * Fixes an issue where the SfBMeetingJoinUx property wasn't properly updated. * DEPENDENCIES diff --git a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 index 0e322f505f..808cf733cf 100644 --- a/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 +++ b/Modules/Microsoft365DSC/DSCResources/MSFT_TeamsComplianceRecordingPolicy/MSFT_TeamsComplianceRecordingPolicy.psm1 @@ -75,13 +75,17 @@ function Get-TargetResource return $nullResult } - if($instance.ComplianceRecordingApplications.Count -gt 0){ + if ($instance.ComplianceRecordingApplications.Count -gt 0) + { $ComplexComplianceRecordingApplications = @() - foreach($CurrentComplianceRecordingApplications in $instance.ComplianceRecordingApplications){ + foreach ($CurrentComplianceRecordingApplications in $instance.ComplianceRecordingApplications) + { $MyComplianceRecordingApplications = @{} $ComplianceRecordingPairedApplications = @() - if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ - foreach($CurrentComplianceRecordingPairedApplications in $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications){ + if ($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0) + { + foreach ($CurrentComplianceRecordingPairedApplications in $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) + { $ComplianceRecordingPairedApplications += $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Id } } @@ -93,7 +97,8 @@ function Get-TargetResource $MyComplianceRecordingApplications.Add('RequiredDuringCall', $CurrentComplianceRecordingApplications.RequiredDuringCall) $MyComplianceRecordingApplications.Add('ConcurrentInvitationCount', $CurrentComplianceRecordingApplications.ConcurrentInvitationCount) - if ($MyComplianceRecordingApplications.values.Where({$null -ne $_}).count -gt 0){ + if ($MyComplianceRecordingApplications.values.Where({ $null -ne $_ }).count -gt 0) + { $ComplexComplianceRecordingApplications += $MyComplianceRecordingApplications } } @@ -223,8 +228,10 @@ function Set-TargetResource Write-Verbose -Message "Creating {$Identity} with Parameters:`r`n$(Convert-M365DscHashtableToString -Hashtable $CreateParameters)" New-CsTeamsComplianceRecordingPolicy @CreateParameters | Out-Null - if($ComplianceRecordingApplications.Count -gt 0){ - foreach($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications){ + if ($ComplianceRecordingApplications.Count -gt 0) + { + foreach ($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications) + { $Instance = $CurrentComplianceRecordingApplications.Id $RequiredBeforeMeetingJoin = $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin $RequiredBeforeCallEstablishment = $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment @@ -233,7 +240,8 @@ function Set-TargetResource $ConcurrentInvitationCount = $CurrentComplianceRecordingApplications.ConcurrentInvitationCount $CsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ErrorAction SilentlyContinue - if($null -eq $CsTeamsComplianceRecordingApplication){ + if ($null -eq $CsTeamsComplianceRecordingApplication) + { New-CsTeamsComplianceRecordingApplication ` -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` @@ -242,9 +250,10 @@ function Set-TargetResource -ConcurrentInvitationCount $ConcurrentInvitationCount ` -Parent $Identity -Id $Instance } - else{ + else + { Set-CsTeamsComplianceRecordingApplication ` - -Identity $CsTeamsComplianceRecordingApplicationIdentity ` + -Identity $CsTeamsComplianceRecordingApplicationIdentity ` -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` -RequiredDuringMeeting $RequiredDuringMeeting ` @@ -252,14 +261,15 @@ function Set-TargetResource -ConcurrentInvitationCount $ConcurrentInvitationCount } - if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ + if ($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0) + { Set-CsTeamsComplianceRecordingApplication ` -Identity "$Identity + '/' + $Instance" ` -ComplianceRecordingPairedApplications @(New-CsTeamsComplianceRecordingPairedApplication ` - -Id $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) + -Id $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications) } } - $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object{$_.Identity -match $Identity} + $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object { $_.Identity -match $Identity } Set-CsTeamsComplianceRecordingPolicy -Identity $Identity -ComplianceRecordingApplications $NewCsTeamsComplianceRecordingApplication } @@ -283,8 +293,10 @@ function Set-TargetResource } Set-CsTeamsComplianceRecordingPolicy @UpdateParameters | Out-Null - if($ComplianceRecordingApplications.Count -gt 0){ - foreach($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications){ + if ($ComplianceRecordingApplications.Count -gt 0) + { + foreach ($CurrentComplianceRecordingApplications in $ComplianceRecordingApplications) + { $Instance = $CurrentComplianceRecordingApplications.Id $RequiredBeforeMeetingJoin = $CurrentComplianceRecordingApplications.RequiredBeforeMeetingJoin $RequiredBeforeCallEstablishment = $CurrentComplianceRecordingApplications.RequiredBeforeCallEstablishment @@ -295,7 +307,8 @@ function Set-TargetResource $CsTeamsComplianceRecordingApplicationIdentity = $Identity + '/' + $Instance $CsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ErrorAction SilentlyContinue - if($null -eq $CsTeamsComplianceRecordingApplication){ + if ($null -eq $CsTeamsComplianceRecordingApplication) + { New-CsTeamsComplianceRecordingApplication ` -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` @@ -304,9 +317,10 @@ function Set-TargetResource -ConcurrentInvitationCount $ConcurrentInvitationCount ` -Parent $Identity -Id $Instance } - else{ + else + { Set-CsTeamsComplianceRecordingApplication ` - -Identity $CsTeamsComplianceRecordingApplicationIdentity ` + -Identity $CsTeamsComplianceRecordingApplicationIdentity ` -RequiredBeforeMeetingJoin $RequiredBeforeMeetingJoin ` -RequiredBeforeCallEstablishment $RequiredBeforeCallEstablishment ` -RequiredDuringMeeting $RequiredDuringMeeting ` @@ -314,13 +328,14 @@ function Set-TargetResource -ConcurrentInvitationCount $ConcurrentInvitationCount } - if($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0){ + if ($CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications.Count -gt 0) + { [string]$CsTeamsComplianceRecordingApplicationIdentity = $Identity + '/' + $Instance [string]$ComplianceRecordingPairedApplications = $CurrentComplianceRecordingApplications.ComplianceRecordingPairedApplications Set-CsTeamsComplianceRecordingApplication -Identity $CsTeamsComplianceRecordingApplicationIdentity -ComplianceRecordingPairedApplications @(New-CsTeamsComplianceRecordingPairedApplication -Id $ComplianceRecordingPairedApplications) } } - $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object{$_.Identity -match $Identity} + $NewCsTeamsComplianceRecordingApplication = Get-CsTeamsComplianceRecordingApplication | Where-Object { $_.Identity -match $Identity } Set-CsTeamsComplianceRecordingPolicy -Identity $Identity -ComplianceRecordingApplications $NewCsTeamsComplianceRecordingApplication } } From 24a5053af4b9eff69a5dc17b252387e671f7433d Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Fri, 17 Nov 2023 10:28:15 +0100 Subject: [PATCH 09/10] minor typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 164cc2115c..e9aa2b2df5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ * MISC * M365DSCReport: Also define property dataType, if present, as being primary key on CIM instances. -* TeamsComplianceREcordingPolicy +* TeamsComplianceRecordingPolicy * FIXES [[#3712](https://github.com/microsoft/Microsoft365DSC/issues/3712)] * TeamsUpgradeConfiguration * Fixes an issue where the SfBMeetingJoinUx property wasn't properly updated. From 5f4763b76e55dced3df8c675b2c2635a7ca9e6f9 Mon Sep 17 00:00:00 2001 From: Sandro Lanfranchi Date: Mon, 18 Mar 2024 18:31:41 +0100 Subject: [PATCH 10/10] Update tests --- ...C.TeamsComplianceRecordingPolicy.Tests.ps1 | 94 ++++++++++++++----- 1 file changed, 68 insertions(+), 26 deletions(-) diff --git a/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 b/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 index 2d3616280d..280e09f7ef 100644 --- a/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 +++ b/Tests/Unit/Microsoft365DSC/Microsoft365DSC.TeamsComplianceRecordingPolicy.Tests.ps1 @@ -94,7 +94,6 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = @('123456') Identity = 'FakeStringValue' Ensure = 'Absent' Credential = $Credential @@ -106,14 +105,29 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = "Microsoft.Teams.Policy.Aministration.Cmdlets.Core.CompianceRecordingApplication" + ComplianceRecordingApplications = @( + @{ + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + ) Identity = 'FakeStringValue' } } Mock -CommandName Get-CsTeamsComplianceRecordingApplication -MockWith { return @{ - Identity = 'FakeStringValue/123456' - Id = '123456' + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True } } @@ -123,9 +137,7 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { $Result = (Get-TargetResource @testParams) $Result.Ensure | Should -Be 'Present' $Result.ComplianceRecordingApplications.Length | Should -Be 1 - $Result.ComplianceRecordingApplications[0] | Should -Be '123456' Should -Invoke -CommandName Get-CsTeamsComplianceRecordingPolicy -Exactly 1 - Should -Invoke -CommandName Get-CsTeamsComplianceRecordingApplication -ParameterFilter {$Filter -eq 'FakeStringValue/*'} -Exactly 1 } @@ -146,7 +158,6 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = @('123456') Identity = 'FakeStringValue' Ensure = 'Present' Credential = $Credential @@ -158,15 +169,29 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = "Microsoft.Teams.Policy.Aministration.Cmdlets.Core.CompianceRecordingApplication" + ComplianceRecordingApplications = @( + @{ + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + ) Identity = 'FakeStringValue' - } } Mock -CommandName Get-CsTeamsComplianceRecordingApplication -MockWith { return @{ - Identity = 'FakeStringValue/123456' - Id = '123456' + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True } } } @@ -191,18 +216,33 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Mock -CommandName Get-CsTeamsComplianceRecordingPolicy -MockWith { return @{ WarnUserOnRemoval = $False - Description = 'FakeStringValueDrift' #Drift - Enabled = $False - DisableComplianceRecordingAudioNotificationForCalls = $False - ComplianceRecordingApplications = "Microsoft.Teams.Policy.Aministration.Cmdlets.Core.CompianceRecordingApplication" + Description = 'FakeStringValue' + Enabled = $True + DisableComplianceRecordingAudioNotificationForCalls = $True + ComplianceRecordingApplications = @( + @{ + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + ) Identity = 'FakeStringValue' } } Mock -CommandName Get-CsTeamsComplianceRecordingApplication -MockWith { return @{ - Identity = 'FakeStringValue/123456Drift' - Id = '123456Drift' #Drift + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True } } } @@ -235,18 +275,20 @@ Describe -Name $Global:DscHelper.DescribeHeader -Fixture { Description = 'FakeStringValue' Enabled = $True DisableComplianceRecordingAudioNotificationForCalls = $True - ComplianceRecordingApplications = "Microsoft.Teams.Policy.Aministration.Cmdlets.Core.CompianceRecordingApplication" + ComplianceRecordingApplications = @( + @{ + Id = '00000000-0000-0000-0000-000000000000' + ComplianceRecordingPairedApplications = @() + ConcurrentInvitationCount = 1 + RequiredDuringCall = $True + RequiredBeforeMeetingJoin = $True + RequiredBeforeCallEstablishment = $True + RequiredDuringMeeting = $True + } + ) Identity = 'FakeStringValue' - } } - Mock -CommandName Get-CsTeamsComplianceRecordingApplication -MockWith { - return @{ - Identity = 'FakeStringValue/123456' - Id = '123456' - } - } - } It 'Should Reverse Engineer resource from the Export method' {