Get-TenantLocation.ps1

<#PSScriptInfo
 
.VERSION 1.1
 
.GUID dfcbe75b-ea2f-4593-8a86-65a40512c32c
 
.DESCRIPTION Retrieve tenant service location infomation
 
.AUTHOR Aaron Guilmette
 
.COMPANYNAME Microsoft
 
.COPYRIGHT 2018
 
.TAGS tenant location
 
.LICENSEURI
 
.PROJECTURI https://www.undocumented-features.com/2018/10/06/determining-your-office-365-tenant-location/
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
#>

<#
THIS CODE AND ANY ASSOCIATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK OF USE, INABILITY TO USE, OR RESULTS FROM THE USE OF
THIS CODE REMAINS WITH THE USER.
 
Author: Aaron Guilmette
        aaron.guilmette@microsoft.com
#>


<#
.SYNOPSIS
Use this script to add the tenant.mail.onmicrosoft.com proxy address to
mailboxes without the email address policy applied.
 
.PARAMETER Domain
Specifiess a verified domain in the tenant, such as tenant.onmicrosoft.com or
domain.com.
 
.NOTES
2023-02-22 - Added script build information for PSGallery
2018-10-11 - Added RealmResponseData query
2018-10-06 - Initial release
 
.LINK
https://www.undocumented-features.com/2018/10/06/determining-your-office-365-tenant-location/
 
#>

[CmdletBinding()]
Param (
    [Parameter(Mandatory = $true, ParameterSetName = 'Domain')]
    [string]$Domain,
    [string]$User
)

$RealmResponseData = Invoke-WebRequest -Uri "https://login.microsoftonline.com/getuserrealm.srf?login=user@$($Domain)&xml=1"

If ($RealmResponseData -and $RealmResponseData.StatusCode -eq 200)
{
    # Return namespace type. Valid options are Unknown, Managed, or Federated
    $NameSpaceType = ([xml]($RealmResponseData.Content)).RealmInfo.NameSpaceType
    
    # Check Retrieve Federation Data
    $FederationData = ([xml]($RealmResponseData.Content)).RealmInfo.FederationBrandName
    
    If ($NameSpaceType -eq "Federated")
    {
        $FederationEndpoint = ([xml]($RealmResponseData.Content)).RealmInfo.AuthURL.Split("/")[2]
    }
    Else
    {
        $FederationEndpoint = "Not applicable"
    }
    try
    {
        $RealmResponseData = Invoke-WebRequest -Uri "https://login.microsoftonline.com/$($Domain)/v2.0/.well-known/openid-configuration"
        $Content = $RealmResponseData.Content | ConvertFrom-Json
        
        $TenantData = New-Object PSObject
        $TenantData | Add-Member -MemberType NoteProperty -Name "OrganizationData" -Value $FederationData
        $TenantData | Add-Member -MemberType NoteProperty -Name "DomainName" -Value $Domain
        $TenantData | Add-Member -MemberType NoteProperty -Name "AuthType" -Value $NameSpaceType
        $TenantData | Add-Member -MemberType NoteProperty -Name "FederationEndpoint" -Value $FederationEndpoint
        $TenantData | Add-Member -MemberType NoteProperty -Name "TenantId" -Value $Content.token_endpoint.Split("/")[3]
        $TenantData | Add-Member -MemberType NoteProperty -Name "TenantRegion" -Value $Content.tenant_region_scope
        $TenantData | Add-Member -MemberType NoteProperty -Name "TenantSubRegion" -Value $Content.tenant_region_sub_scope
        $TenantData | Add-Member -MemberType NoteProperty -Name "CloudInstanceName" -Value $Content.cloud_instance_name
        
        $TenantData
    }
    catch
    {
        if ($_.Exception.ToString() -like "*invalid_tenant*")
        {
            "Domain $($Domain) is not a valid tenant."
        }
        else
        {
            $_.Exception.ToString()
        }
    }
}
else
{
    Write-Error -Message 'Domain could not be verified with the Azure endpoint. Please verify that the domain exists and that https://login.microsoftonline.com are reachable.'
}