VMware.WorkspaceOneAccess.psm1

Function Connect-WorkspaceOneAccess {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Log into Workspace One Access (formally VMware Identity Manager)
    .DESCRIPTION
        This cmdlet creates $global:workspaceOneAccessConnection object containing valid refresh token to vIDM/Workspace One Access
    .EXAMPLE
        Connect-WorkspaceOneAccess -Tenant $Tenant -ClientId $ClientId -ClientSecret $ClientSecret
#>

    Param (
        [Parameter(Mandatory=$true)][String]$Tenant,
        [Parameter(Mandatory=$true)][String]$ClientId,
        [Parameter(Mandatory=$true)][String]$ClientSecret,
        [Switch]$Troubleshoot
    )

    $text = "${ClientId}:${ClientSecret}"
    $base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($text))

    $headers = @{
        "Authorization"="Basic $base64";
        "Content-Type"="application/x-www-form-urlencoded";
    }

    $oauthUrl = "https://${Tenant}/SAAS/auth/oauthtoken?grant_type=client_credentials"
    $method = "POST"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$oauthUrl`n"
    }

    $results = Invoke-WebRequest -Uri $oauthUrl -Method $method -Headers $headers
    if($results.StatusCode -ne 200) {
        Write-Host -ForegroundColor Red "Failed to retrieve Access Token, please ensure your ClientId and Client Secret is valid"
        break
    }
    $accessToken = ($results.Content | ConvertFrom-Json).access_token

    $authHeader = @{
        "Authorization"="Bearer $accessToken";
    }

    $global:workspaceOneAccessConnection = new-object PSObject -Property @{
        'Server' = "https://$Tenant"
        'headers' = $authHeader
    }
    $global:workspaceOneAccessConnection
}

Function Get-WSDirectory {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Retrieves all Directories within Workspace One Access
    .DESCRIPTION
        This cmdlet retrieves all Directories within Workspace One Access
    .EXAMPLE
        Get-WSDirectory
    .EXAMPLE
        Get-WSDirectory -Name <DIRECTORY>
#>

    Param (
        [Parameter(Mandatory=$false)][String]$Name,
        [Switch]$Troubleshoot
    )

    $directoryHeaders = @{
        "Accept"="application/vnd.vmware.horizon.manager.connector.management.directory.list+json";
        "Content-Type"="application/vnd.vmware.horizon.manager.connector.management.directory.list+json";
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $directoryUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/connectormanagement/directoryconfigs?includeJitDirectories=true"
    $method = "GET"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in retrieving Directory"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 200) {
        $directories = ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json).items

        if ($PSBoundParameters.ContainsKey("Name")){
            $directories = $directories | where {$_.name -eq $Name}
        }

        $directories
    }
}

Function Remove-WSDirectory {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Deletes a specific Workspace One Access Directory
    .DESCRIPTION
        This cmdlet deletes a specific directory within Workspace One Access
    .EXAMPLE
        Remove-WSDirectory -Name <DIRECTORY>
#>

    Param (
        [Parameter(Mandatory=$false)][String]$Name,
        [Switch]$Troubleshoot
    )

    $directory = Get-WSDirectory -Name $Name

    if($directory) {

        $directoryHeaders = @{
            "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
        }

        $directoryUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/connectormanagement/directoryconfigs/$($directory.directoryId)?asyncDelete=true"
        $method = "DELETE"

        if($Troubleshoot) {
            Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
        }

        try {
            if($PSVersionTable.PSEdition -eq "Core") {
                $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -SkipCertificateCheck
            } else {
                $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders
            }
        } catch {
            if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
                break
            } else {
                Write-Error "Error in deleting new Directory"
                Write-Error "`n($_.Exception.Message)`n"
                break
            }
        }

        if($results.StatusCode -eq 200) {
            Write-Host "`nSuccessfully deleted Directory $Name ..."
        }
    } else {
        Write-Host "`nUnable to find Directory $Name"
    }
}

Function New-WSJitDirectory {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Creates a Just-in-Time (Jit) Directory in Workspace One Access
    .DESCRIPTION
        This cmdlet creates a Just-in-Time (Jit) Directory in Workspace One Access
    .EXAMPLE
        New-WSJitDirectory -Name <DIRECTORY>
#>

    Param (
        [Parameter(Mandatory=$false)][String]$Name,
        [Parameter(Mandatory=$false)][String]$Domain,
        [Switch]$Troubleshoot
    )

    $directoryHeaders = @{
        "Accept"="application/vnd.vmware.horizon.manager.connector.management.directory.jit+json";
        "Content-Type"="application/vnd.vmware.horizon.manager.connector.management.directory.jit+json"
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $directoryUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/connectormanagement/directoryconfigs"
    $method = "POST"

    $json = @{
        name = $Name
        domains = @($Domain)
    }

    $body = $json | ConvertTo-Json

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
        Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -Body $body -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -Body $body
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in creating new Jit Directory"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 201) {
        Write-Host "`nSuccessfully created Jit Directory $Name ..."
        ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json)
    }
}

Function Get-WSOrgNetwork {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Retreives all Org Networks within Workspace One Access
    .DESCRIPTION
        This cmdlet retreives all Org Networks within Workspace One Access
    .EXAMPLE
        Get-WSOrgNetwork
    .EXAMPLE
        Get-WSOrgNetwork -Name <NETWORK>
#>

    Param (
        [Parameter(Mandatory=$false)][String]$Name,
        [Switch]$Troubleshoot
    )

    $listOrgNetworkHeaders = @{
        "Accept"="application/vnd.vmware.horizon.manager.orgnetwork.list+json";
        "Content-Type"="application/vnd.vmware.horizon.manager.orgnetwork.list+json"
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $orgNetworkUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/orgnetworks"
    $method = "GET"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$orgNetworkUrl`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $orgNetworkUrl -Method $method -UseBasicParsing -Headers $listOrgNetworkHeaders -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $orgNetworkUrl -Method $method -UseBasicParsing -Headers $listOrgNetworkHeaders
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in creating new Directory"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 200) {
        $networks = ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json).items

        if ($PSBoundParameters.ContainsKey("Name")){
            $networks = $networks | where {$_.name -eq $Name}
        }

        $networks
    }
}

Function Get-WSIdentityProvider {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Retreives all Identity Providers within Workspace One Access
    .DESCRIPTION
        This cmdlet retreives all Identity Providers within Workspace One Access
    .EXAMPLE
        Get-WSIdentityProvider
    .EXAMPLE
        Get-WSIdentityProvider -Name <PROVIDER>
#>

    Param (
        [Parameter(Mandatory=$false)][String]$Name,
        [Switch]$Troubleshoot
    )

    $listOrgNetworkHeaders = @{
        "Accept"="application/vnd.vmware.horizon.manager.identityprovider.summary.list+json";
        "Content-Type"="application/vnd.vmware.horizon.manager.identityprovider.summary.list+json"
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $providerUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/identityProviders?onlyEnabledAdapters=true"
    $method = "GET"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$providerUrl`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $providerUrl -Method $method -UseBasicParsing -Headers $listOrgNetworkHeaders -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $providerUrl -Method $method -UseBasicParsing -Headers $listOrgNetworkHeaders
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in retrieving Directory"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 200) {
        $providers = ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json).items

        if ($PSBoundParameters.ContainsKey("Name")){
            $providers = $providers | where {$_.name -eq $Name}
        }

        $providers
    }
}

Function New-WS3rdPartyIdentityProvider {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Creates a new 3rd Party Identity Providers within Workspace One Access
    .DESCRIPTION
        This cmdlet creates a new 3rd party Identity Provider within Workspace One Access
    .EXAMPLE
        New-WS3rdPartyIdentityProvider
    .EXAMPLE
        New-WS3rdPartyIdentityProvider -Name "AWS Directory Service" -DirectoryName "VMware" -NetworkName "ALL RANGES" -MetadataFile FederationMetadata.xml
#>

    Param (
        [Parameter(Mandatory=$true)][String]$Name,
        [Parameter(Mandatory=$true)][String]$DirectoryName,
        [Parameter(Mandatory=$true)][String]$NetworkName,
        [Parameter(Mandatory=$true)][String]$MetadataFile,
        [Switch]$Troubleshoot
    )

    $idpDirectory = Get-WSDirectory -Name $DirectoryName
    $network = Get-WSOrgNetwork -Name $NetworkName
    $metadataXML = Get-Content -Raw $MetadataFile

    $idpBody = [pscustomobject] @{
        "authMethods" = @(
            @{
                "authMethodId" = 1;
                "authScore" = 1;
                "defaultMethod" = $false;
                "authMethodOrder" = 0;
                "authMethodName" = "adfsPassword";
                "samlAuthnContext" = "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport";
            }
        );
        "identityProviderType" = "MANUAL";
        "nameIdFormatType" = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress";
        "identityFromSamlAttribute" = $false;
        "friendlyName" = $Name;
        "metaData" = "$metadataXML";
        "preferredBinding" = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST";
        "jitEnabled" = "true";
        "saml2IdPSLOConfiguration" = @{
            "sendSLORequest" = $true;
        }
        "directoryConfigurations" = @(
            [pscustomobject] @{
                "type" = $idpDirectory.type;
                "name" = $idpDirectory.name;
                "directoryId" = $idpDirectory.directoryId;
                "userstoreId" = $idpDirectory.userstoreId;
                "countDomains" = $idpDirectory.countDomains;
                "deleteInProgress" = $false;
                "migratedToEnterpriseService" = $false;
                "syncConfigurationEnabled" = $false;
            }
        );
        "nameIdFormatAttributeMappings" = [pscustomobject] @{
            "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" = "emails";
            "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" = "id";
            "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" = "userName";
        };
        "orgNetworks" = @(
            [pscustomobject] @{
                "name" = $network.name;
                "ipAddressRanges" = $network.ipAddressRanges;
                "uuid" = $network.uuid;
                "description" = $network.description;
                "defaultNetwork" = $network.defaultNetwork;
            }
        );
        "description" = "";
        "nIDPStatus" = 1;
        "idpUrl" = $null;
        "name" = $Name;
    }

    $idpHeaders = @{
        "Accept"="application/vnd.vmware.horizon.manager.external.identityprovider+json";
        "Content-Type"="application/vnd.vmware.horizon.manager.external.identityprovider+json";
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $body = $idpBody | ConvertTo-Json -Depth 10

    $identityProviderUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/identityProviders"
    $method = "POST"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
        Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $identityProviderUrl -Method $method -UseBasicParsing -Headers $idpHeaders -Body $body -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $identityProviderUrl -Method $method -UseBasicParsing -Headers $idpHeaders -Body $body
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in creating new Identity Provider"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 201) {
        Write-Host "`nSuccessfully created new Identity Provider $Name ..."
        ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json) | Select Name, Id
    }
}

Function Remove-WS3rdPartyIdentityProvider {
<#
    .NOTES
    ===========================================================================
    Created by: William Lam
    Date: 02/04/2020
    Organization: VMware
    Blog: http://www.virtuallyghetto.com
    Twitter: @lamw
    ===========================================================================

    .SYNOPSIS
        Deletes a specific 3rd Party Identity Provider within Workspace One Access
    .DESCRIPTION
        This cmdlet deletes a specific 3rd Party Identity Provider within Workspace One Access
    .EXAMPLE
        Remove-WS3rdPartyIdentityProvider -Name <IDP>
#>

    Param (
        [Parameter(Mandatory=$true)][String]$Name,
        [Switch]$Troubleshoot
    )

    $idp = Get-WSIdentityProvider -Name $Name

    if($idp) {
        $identityProviderHeaders = @{
            "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
        }

        $identityProviderURL = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/identityProviders/$($idp.id)"
        $method = "DELETE"

        if($Troubleshoot) {
            Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$identityProviderURL`n"
        }

        try {
            if($PSVersionTable.PSEdition -eq "Core") {
                $results = Invoke-Webrequest -Uri $identityProviderURL -Method $method -UseBasicParsing -Headers $identityProviderHeaders -SkipCertificateCheck
            } else {
                $results = Invoke-Webrequest -Uri $identityProviderURL -Method $method -UseBasicParsing -Headers $identityProviderHeaders
            }
        } catch {
            if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
                break
            } else {
                Write-Error "Error in deleting Identity Provider"
                Write-Error "`n($_.Exception.Message)`n"
                break
            }
        }

        if($results.StatusCode -eq 200) {
            Write-Host "`nSuccessfully deleted Identity Provider $Name ..."
        }
    } else {
        Write-Host "`nUnable to find Identity Provider $Name"
    }
}

Function Get-UEMConfig {
<#
    .NOTES
    ===========================================================================
    Created by: Alan Renouf
    Date: 04/15/2020
    Organization: VMware
    Blog: http://virtu-al.net
    Twitter: @alanrenouf
    ===========================================================================

    .SYNOPSIS
        Retrieves UEM Configuration from Workspace One Access
    .DESCRIPTION
        This cmdlet retrieves the UEM Configuration from Workspace One Access
    .EXAMPLE
        Get-UEMConfig
    .EXAMPLE
        Get-UEMConfig
#>

    Param (
        [Switch]$Troubleshoot
    )

    $directoryHeaders = @{
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $directoryUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/tenants/tenant/airwatchoptin/config"
    $method = "GET"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in retrieving UEM Configuration"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 200) {
        $config = ([System.Text.Encoding]::ASCII.GetString($results.Content) | ConvertFrom-Json)
        $config
    }
}

Function Remove-UEMConfig {
<#
    .NOTES
    ===========================================================================
    Created by: Alan Renouf
    Date: 04/15/2020
    Organization: VMware
    Blog: http://virtu-al.net
    Twitter: @alanrenouf
    ===========================================================================

    .SYNOPSIS
        Removes the UEM Configuration from Workspace One Access
    .DESCRIPTION
        This cmdlet removes the UEM Configuration from Workspace One Access, there can only be one configuration.
    .EXAMPLE
        Remove-UEMConfig
    .EXAMPLE
        Remove-UEMConfig
#>

    Param (
        [Switch]$Troubleshoot
    )

    $directoryHeaders = @{
        "Authorization"=$global:workspaceOneAccessConnection.headers.Authorization;
    }

    $directoryUrl = $global:workspaceOneAccessConnection.Server + "/SAAS/jersey/manager/api/tenants/tenant/airwatchoptin/config"
    $method = "DELETE"

    if($Troubleshoot) {
        Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$directoryUrl`n"
    }

    try {
        if($PSVersionTable.PSEdition -eq "Core") {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders -SkipCertificateCheck
        } else {
            $results = Invoke-Webrequest -Uri $directoryUrl -Method $method -UseBasicParsing -Headers $directoryHeaders
        }
    } catch {
        if($_.Exception.Response.StatusCode -eq "Unauthorized") {
            Write-Host -ForegroundColor Red "`nThe Workspace One session is no longer valid, please re-run the Connect-WorkspaceOne cmdlet to retrieve a new token`n"
            break
        } else {
            Write-Error "Error in deleting UEM Configuration"
            Write-Error "`n($_.Exception.Message)`n"
            break
        }
    }

    if($results.StatusCode -eq 200) {
        Write-Host "`nSuccessfully deleted UEM Configuration"
    }
}