Endpoints.psm1

<#
.SYNOPSIS
    This function retrieves the credential (username + password) from a MSPComplete Endpoint.
.DESCRIPTION
    This function retrieves the credential (username + password) from a MSPComplete Endpoint.
    There is no pre-processing required on the Endpoint, whether it is passed in using
    the MSPComplete platform or retrieved using Get-BT_Endpoint.
.PARAMETER endpointID
    The ID of the MSPComplete Endpoint.
.PARAMETER endpoint
    The MSPComplete Endpoint.
.PARAMETER ticket
    The MSPComplete Customer Ticket.
.PARAMETER environment
    The Environment where the Endpoint is stored.
.EXAMPLE
    $unmaskedEndpoint = Get-CredentialFromMSPCompleteEndpoint -EndpointID $Endpoint.Id
.EXAMPLE
    $unmaskedEndpoint = Get-CredentialFromMSPCompleteEndpoint -Endpoint $Endpoint
.EXAMPLE
    $unmaskedEndpoint = $Endpoint | Get-CredentialFromMSPCompleteEndpoint
#>

function Get-CredentialFromMSPCompleteEndpoint {
    param (
        # The ID of the MSPComplete Endpoint
        [Parameter(Mandatory=$true, ParameterSetName="endpointID")]
        [String]$endpointID,

        # The MSPComplete Endpoint
        [Parameter(Mandatory=$true, ParameterSetName="endpoint", ValueFromPipeline=$true)]
        $endpoint,

        # The MSPComplete Ticket
        [Parameter(Mandatory=$false)]
        $ticket = $mspc.Ticket,

        # The environment where the endpoint is stored.
        [Parameter(Mandatory=$false)]
        [ValidateSet("BT", "Beta", "Develop", "Release")]
        [String]$environment = "Beta"
    )

    # Endpoint is provided and it already has a "Credential" property
    # This case applies when the endpoint is passed in on the MSPComplete platform
    if ($null -ne $endpoint.Credential -and ![String]::IsNullOrWhiteSpace($endpoint.Credential.UserName) -and $null -ne $endpoint.Credential.Password) {
        Write-Information "Using the 'Credential' property from the Endpoint '$($endpoint.Name)'."
        return $endpoint.Credential
    }

    # Retrieve the endpoint ID from the endpoint
    if ($PSCmdlet.ParameterSetName -eq "endpoint") {
        $endpointID = $endpoint.Id
    }

    # Retrieve the endpoint with a credential property, and return the credential
    Write-Information "Retrieving the Endpoint with a 'Credential' property."
    return (Get-MSPCompleteEndpointWithCredential -EndpointID $endpointID -Ticket $ticket -Environment $environment).Credential
}

<#
.SYNOPSIS
    This function retrieves a copy of the given MSPComplete Endpoint with a "Credential" property.
.DESCRIPTION
    This function retrieves a copy of the given MSPComplete Endpoint with a "Credential" property.
    The property is a PSCredential object storing the username and password.
.PARAMETER endpointID
    The ID of the MSPComplete Endpoint.
.PARAMETER endpoint
    The MSPComplete Endpoint.
.PARAMETER ticket
    The MSPComplete Ticket.
.PARAMETER environment
    The Environment where the Endpoint is stored.
.EXAMPLE
    Get-MSPCompleteEndpointWithCredential -EndpointID $Endpoint.Id
.EXAMPLE
    Get-MSPCompleteEndpointWithCredential -Endpoint $Endpoint
.EXAMPLE
    $Endpoint | Get-MSPCompleteEndpointWithCredential
#>

function Get-MSPCompleteEndpointWithCredential {
    param (
        # The ID of the MSPComplete Endpoint.
        [Parameter(Mandatory=$true, ParameterSetName="endpointID")]
        [String]$endpointID,

        # The MSPComplete Endpoint.
        [Parameter(Mandatory=$true, ParameterSetName="endpoint", ValueFromPipeline=$true)]
        $endpoint,

        # The MSPComplete Ticket.
        [Parameter(Mandatory=$false)]
        $ticket = $mspc.Ticket,

        # The environment where the endpoint is stored.
        [Parameter(Mandatory=$false)]
        [ValidateSet("BT", "Beta", "Develop", "Release")]
        [String]$environment = "Beta"
    )

    # Retrieve the endpoint ID from the endpoint
    if ($PSCmdlet.ParameterSetName -eq "endpoint") {
        $endpointID = $endpoint.Id
    }

    # Retrieve the masked endpoint to return later
    else {
        try {
            $endpoint = Get-BT_Endpoint -Ticket $ticket -Id $endpointID -Environment $environment
        }
        catch {
            Write-Error "Error while retrieving masked endpoint with ID '$($endpointID)'. `r`n$($_.Exception.Message)"
            return $null
        }
        if ($null -eq $endpoint) {
            Write-Error "Failed to retrieve masked endpoint with ID '$($endpointID)'."
            return $null
        }
    }

    # Try to retrieve the unmasked endpoint using the endpoint ID
    try {
        # Create hash table to store params
        $getBTEndpointParams = @{
            Ticket                  = $ticket
            Id                      = $endpointID
            ShouldUnmaskProperties  = $true
            Environment             = $environment
        }

        # Get the unmasked endpoint using the endpoint ID
        $unmaskedEndpoint = Get-BT_Endpoint @getBTEndpointParams
    }

    # Error while retrieving unmasked endpoint
    catch {
        Write-Error "Error while retrieving the unmasked Endpoint with ID '$($endpointID)'. `r`n$($_.Exception.Message)"
        return $null
    }

    # Verify endpoint
    if ($null -eq $unmaskedEndpoint) {
        Write-Error "Failed to retrieve the unmasked Endpoint with ID '$($endpointID)'."
        return $null
    }

    # Create the credential object
    # Endpoint contains exchange configuration
    if ($unmaskedEndpoint.Configuration.GetType() -eq [ManagementProxy.ManagementService.ExchangeConfiguration]) {
        $credential = New-Object System.Management.Automation.PSCredential(
            $unmaskedEndpoint.Configuration.AdministrativeUserName,
            ($unmaskedEndpoint.Configuration.AdministrativePassword | ConvertTo-SecureString -AsPlainText -Force)
        )
    }

    # Endpoint contains generic configuration
    elseif ($unmaskedEndpoint.Configuration.GetType() -eq [ManagementProxy.ManagementService.GenericConfiguration]) {
        $credential = New-Object System.Management.Automation.PSCredential(
            $unmaskedEndpoint.Configuration.Username,
            ($unmaskedEndpoint.Configuration.Password | ConvertTo-SecureString -AsPlainText -Force)
        )
    }

    # Currently unsupported configuration type
    else {
        Write-Error "Endpoint '$($unmaskedEndpoint.Name)' has unsupported configuration type '$($endpoint.Configuration.GetType().Name)'."
    }

    # Add credential to masked endpoint
    $endpoint | Add-Member -NotePropertyName "Credential" -NotePropertyValue $credential -Force

    # Return masked endpoint with credential property
    return $endpoint
}