DSCResources/VE_SFAuthenticationServiceMethod/VE_SFAuthenticationServiceMethod.ps1

Import-LocalizedData -BindingVariable localizedData -FileName Resources.psd1;

function ValidateParameters {
    [CmdletBinding()]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Explicit authentication methods available
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $AuthenticationMethods,

        ## Included authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $IncludeAuthenticationMethods,

        ## Excluded authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $ExcludeAuthenticationMethods,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )

    if ($PSBoundParameters.ContainsKey('AuthenticationMethods')) {
        if ($AuthenticationMethods -notcontains 'CitrixFederation') {
            Write-Warning -Message ($localizedData.DefaultPropertyMissingWarning -f 'AuthenticationMethods', 'CitrixFederation');
        }
        ## Cannot have Explicit and Include
        if($PSBoundParameters.ContainsKey('IncludeAuthenticationMethods') -or $PSBoundParameters.ContainsKey('ExcludeAuthenticationMethods')) {
            $errorMessage = $localizedData.MethodsIncludeAndExcludeError -f 'AuthenticationMethods','IncludeAuthenticationMethods','ExcludeAuthenticationMethods';
            ThrowInvalidArgumentError -ErrorId 'MethodsPlusIncludeOrExcludeConflict' -ErrorMessage $errorMessage;
        }
        if ($AuthenticationMethods.Length -eq 0) {
            $errorMessage = $localizedData.MethodsIsNullError -f 'AuthenticationMethods','IncludeAuthenticationMethods','ExcludeAuthenticationMethods';
            ThrowInvalidArgumentError -ErrorId 'MethodsIsNullError' -ErrorMessage $errorMessage;
        }
    }

    if ($PSBoundParameters.ContainsKey('IncludeAuthenticationMethods')) {
        $IncludeAuthenticationMethods = [System.String[]] @(RemoveDuplicateArrayMembers -Members $IncludeAuthenticationMethods);
    }

    if ($PSBoundParameters.ContainsKey('ExcludeAuthenticationMethods')) {
        $ExcludeAuthenticationMethods = [System.String[]] @(RemoveDuplicateArrayMembers -Members $ExcludeAuthenticationMethods);
    }

    if (($PSBoundParameters.ContainsKey('IncludeAuthenticationMethods')) -and ($PSBoundParameters.ContainsKey('ExcludeAuthenticationMethods'))) {
        if (($IncludeAuthenticationMethods.Length -eq 0) -and ($ExcludeAuthenticationMethods.Length -eq 0)) {
            $errorMessage = $localizedData.IncludeAndExcludeAreEmptyError -f 'IncludeAuthenticationMethods', 'ExcludeAuthenticationMethods';
            ThrowInvalidArgumentError -ErrorId 'EmptyIncludeAndExclude' -ErrorMessage $errorMessage;
        }
        # Both IncludeAuthenticationMethods and ExcludeAuthenticationMethods were provided. Check if they have duplicates.
        foreach ($method in $IncludeAuthenticationMethods) {
            if ($ExcludeAuthenticationMethods -contains $method) {
                $errorMessage = $localizedData.IncludeAndExcludeConflictError -f $method, 'IncludeAuthenticationMethods', 'ExcludeAuthenticationMethods';
                ThrowInvalidArgumentError -ErrorId 'IncludeAndExcludeConflictError' -ErrorMessage $errorMessage;
            }
        }
    }

} #end function ValidateParameters

function Get-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Explicit authentication methods available
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $AuthenticationMethods,

        ## Included authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $IncludeAuthenticationMethods,

        ## Excluded authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $ExcludeAuthenticationMethods,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        ImportSFModule -Name Citrix.Storefront.Authentication;
        $authenticationServiceMethods = GetAuthenticationServiceMethods -VirtualPath $VirtualPath;
        $targetResource = @{
            VirtualPath = $VirtualPath;
            AuthenticationMethods = $authenticationServiceMethods;
            Ensure = if ($authenticationServiceMethods) { 'Present' } else { 'Absent' };
        }
        return $targetResource;
    } #end process
} #end function Get-TargetResource

function Test-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Explicit authentication methods available
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $AuthenticationMethods,

        ## Included authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $IncludeAuthenticationMethods,

        ## Excluded authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $ExcludeAuthenticationMethods,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        ValidateParameters @PSBoundParameters;
        $targetResource = Get-TargetResource @PSBoundParameters;
        $inDesiredState = $true;

        if ($Ensure -ne $targetResource.Ensure) {
            Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f 'Ensure', $Ensure, $targetResource.Ensure);
            $inDesiredState = $false;
        }

        ## Only check all remaing properties if we're setting
        if ($Ensure -eq 'Present') {
            if ($PSBoundParameters.ContainsKey('AuthenticationMethods')) {
                if (-not (TestStringArrayEqual -Expected $AuthenticationMethods -Actual $targetResource.AuthenticationMethods)) {
                    $authenticationMethodsString = $AuthenticationMethods -join ',';
                    $actualAuthenticationMethodsString = $targetResource.AuthenticationMethods -join ',';
                    Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f $VirtualPath, $authenticationMethodsString, $actualAuthenticationMethodsString);
                    $inDesiredState = $false;
                }
            }
            if ($PSBoundParameters.ContainsKey('IncludeAuthenticationMethods')) {
                foreach ($method in $IncludeAuthenticationMethods) {
                    if ($targetResource.AuthenticationMethods -notcontains $method) {
                        Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f 'IncludeAuthenticationMethods', $method, '');
                        $inDesiredState = $false;
                    }
                }
            }
            if ($PSBoundParameters.ContainsKey('ExcludeAuthenticationMethods')) {
                foreach ($method in $ExcludeAuthenticationMethods) {
                    if ($targetResource.AuthenticationMethods -contains $method) {
                        Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f 'ExcludeAuthenticationMethods', '', $method);
                        $inDesiredState = $false;
                    }
                }
            }
        } #end if ensure is present

        if ($inDesiredState) {
            Write-Verbose -Message ($localizedData.ResourceInDesiredState -f $VirtualPath);
        }
        else {
            Write-Verbose -Message ($localizedData.ResourceNotInDesiredState -f $VirtualPath);
        }
        return $inDesiredState;
    } #end process
} #end function Test-TargetResource


function Set-TargetResource {
    [CmdletBinding()]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Explicit authentication methods available
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $AuthenticationMethods,

        ## Included authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $IncludeAuthenticationMethods,

        ## Excluded authentication methods, other existing methods will not be removed
        [Parameter()] [ValidateSet('IntegratedWindows','HttpBasic','ExplicitForms','CitrixFederation','CitrixAGBasic','Certificate')]
        [System.String[]] $ExcludeAuthenticationMethods,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        ValidateParameters @PSBoundParameters;
        ImportSFModule -Name Citrix.Storefront.Authentication;
        $authenticationServiceMethods = GetAuthenticationServiceMethods -VirtualPath $VirtualPath;
        $authenticationService = GetAuthenticationService @PSBoundParameters -ThrowIfNull;

        if ($Ensure -eq 'Absent') {
            if ($authenticationServiceMethods) {
                foreach ($method in $authenticationServiceMethods) {
                    Write-Verbose -Message ($localizedData.RemovingAuthenticationMethod -f $method);
                    [ref] $null = Remove-STFAuthenticationServiceProtocol -AuthenticationService $authenticationService -Name $method;
                }
            }
        }
        elseif ($Ensure -eq 'Present') {
            
            if ($PSBoundParameters.ContainsKey('AuthenticationMethods')) {
                ## Convert explicit methods to include
                $IncludeAuthenticationMethods = $AuthenticationMethods;
                ## Exlcude all current methods that are not specified
                foreach ($method in $authenticationServiceMethods) {
                    if ($IncludeAuthenticationMethods -notcontains $method) {
                        if (-not $ExcludeAuthenticationMethods) {
                            $ExcludeAuthenticationMethods = @();
                        }
                        $ExcludeAuthenticationMethods += $method;
                    }
                }
            }

            foreach ($method in $IncludeAuthenticationMethods) {
                Write-Verbose -Message ($localizedData.AddingAuthenticationMethod -f $method);
                [ref] $null = Add-STFAuthenticationServiceProtocol -AuthenticationService $authenticationService -Name $method;
            }

            foreach ($method in $ExcludeAuthenticationMethods) {
                Write-Verbose -Message ($localizedData.RemovingAuthenticationMethod -f $method);
                [ref] $null = Remove-STFAuthenticationServiceProtocol -AuthenticationService $authenticationService -Name $method -Confirm:$false;
            }
        }
    } #end process
} #end function Set-TargetResource