DSCResources/DSC_CMClientSettingsClientPolicy/DSC_CMClientSettingsClientPolicy.psm1

$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common'
$script:configMgrResourcehelper = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\ConfigMgrCBDsc.ResourceHelper'

Import-Module -Name $script:dscResourceCommonPath
Import-Module -Name $script:configMgrResourcehelper

$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US'

<#
    .SYNOPSIS
        This will return a hashtable of results.
 
    .PARAMETER SiteCode
        Specifies the site code for Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName
    )

    Write-Verbose -Message $script:localizedData.RetrieveSettingValue
    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"

    $clientSetting = Get-CMClientSetting -Name $ClientSettingName

    if ($clientSetting)
    {
        $type = @('Default','Device','User')[$clientSetting.Type]
        $settings = Get-CMClientSetting -Name $ClientSettingName -Setting ClientPolicy

        if ($settings)
        {
            $timeout = $settings.PolicyRequestAssignmentTimeout
            $userPolicy = [System.Convert]::ToBoolean($settings.PolicyEnableUserPolicyPolling)
            $internetUser = [System.Convert]::ToBoolean($settings.PolicyEnableUserPolicyOnInternet)
            $multiUser = [System.Convert]::ToBoolean($settings.PolicyEnableUserPolicyOnTS)
        }

        $status = 'Present'
    }
    else
    {
        $status = 'Absent'
    }

    return @{
        SiteCode                   = $SiteCode
        ClientSettingName          = $ClientSettingName
        PolicyPollingMins          = $timeout
        EnableUserPolicy           = $userPolicy
        EnableUserPolicyOnInternet = $internetUser
        EnableUserPolicyOnTS       = $multiUser
        ClientSettingStatus        = $status
        ClientType                 = $type
    }
}

<#
    .SYNOPSIS
        This will set the desired state.
 
    .PARAMETER SiteCode
        Specifies a site code for the Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
 
    .PARAMETER PolicyPollingMins
        Specifies client policy interval in minutes.
 
    .PARAMETER EnableUserPolicy
        Specifies if user policy on clients is enabled or disabled.
 
    .PARAMETER EnableUserPolicyOnInternet
        Specifies if user policy request from internet clients is enabled or disabled.
 
    .PARAMETER EnableUserPolicyOnTS
        Specifies if user policy for multiple sessions is enabled or disabled.
#>

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName,

        [Parameter()]
        [ValidateRange(3,1440)]
        [UInt32]
        $PolicyPollingMins,

        [Parameter()]
        [Boolean]
        $EnableUserPolicy,

        [Parameter()]
        [Boolean]
        $EnableUserPolicyOnInternet,

        [Parameter()]
        [Boolean]
        $EnableUserPolicyOnTS
    )

    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"
    $state = Get-TargetResource -SiteCode $SiteCode -ClientSettingName $ClientSettingName

    try
    {
        if ($state.ClientSettingStatus -eq 'Absent')
        {
            throw ($script:localizedData.ClientPolicySetting -f $ClientSettingName)
        }

        if ($state.ClientType -eq 'User')
        {
            throw $script:localizedData.WrongClientType
        }

        $defaultValues = @('PolicyPollingMins','EnableUserPolicy','EnableUserPolicyOnInternet','EnableUserPolicyOnTS')

        foreach ($param in $PSBoundParameters.GetEnumerator())
        {
            if ($defaultValues -contains $param.Key)
            {
                if ($param.Value -ne $state[$param.Key])
                {
                    Write-Verbose -Message ($script:localizedData.SettingValue -f $param.Key, $param.Value)
                    $buildingParams += @{
                        $param.Key = $param.Value
                    }
                }
            }
        }

        if ($buildingParams)
        {
            if ($state.ClientType -eq 'Default')
            {
                Set-CMClientSettingClientPolicy -DefaultSetting @buildingParams
            }
            else
            {
                Set-CMClientSettingClientPolicy -Name $ClientSettingName @buildingParams
            }
        }
    }
    catch
    {
        throw $_
    }
    finally
    {
        Set-Location -Path "$env:temp"
    }
}

<#
    .SYNOPSIS
        This will test the desired state.
 
    .PARAMETER SiteCode
        Specifies a site code for the Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
 
    .PARAMETER PolicyPollingMins
        Specifies client policy interval in minutes.
 
    .PARAMETER EnableUserPolicy
        Specifies if user policy on clients is enabled or disabled.
 
    .PARAMETER EnableUserPolicyOnInternet
        Specifies if user policy request from internet clients is enabled or disabled.
 
    .PARAMETER EnableUserPolicyOnTS
        Specifies if user policy for multiple sessions is enabled or disabled.
#>

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName,

        [Parameter()]
        [ValidateRange(3,1440)]
        [UInt32]
        $PolicyPollingMins,

        [Parameter()]
        [Boolean]
        $EnableUserPolicy,

        [Parameter()]
        [Boolean]
        $EnableUserPolicyOnInternet,

        [Parameter()]
        [Boolean]
        $EnableUserPolicyOnTS
    )

    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"
    $state = Get-TargetResource -SiteCode $SiteCode -ClientSettingName $ClientSettingName
    $result = $true

    if ($state.ClientSettingStatus -eq 'Absent')
    {
        Write-Warning -Message ($script:localizedData.ClientPolicySetting -f $ClientSettingName)
        $result = $false
    }
    elseif ($state.ClientType -eq 'User')
    {
        Write-Warning -Message $script:localizedData.WrongClientType
        $result = $false
    }
    else
    {
        $defaultValues = @('PolicyPollingMins','EnableUserPolicy','EnableUserPolicyOnInternet','EnableUserPolicyOnTS')

        $testParams = @{
            CurrentValues = $state
            DesiredValues = $PSBoundParameters
            ValuesToCheck = $defaultValues
        }

        $result = Test-DscParameterState @testParams -TurnOffTypeChecking -Verbose
    }

    Write-Verbose -Message ($script:localizedData.TestState -f $result)
    Set-Location -Path "$env:temp"
    return $result
}

Export-ModuleMember -Function *-TargetResource