Public/Get-ADSIFsmo.ps1

function Get-ADSIFsmo
{
<#
    .SYNOPSIS
        Function to retrieve the Flexible single master operation (FSMO) roles owner(s)
     
    .DESCRIPTION
        Function to retrieve the Flexible single master operation (FSMO) roles owner(s)
     
    .PARAMETER Credential
        Specifies the Alternative credential to use
     
    .PARAMETER ForestName
        Specifies the alternative forest name
     
    .NOTES
        Francois-Xavier Cat
        lazywinadmin.com
        @lazywinadm
        github.com/lazywinadmin
#>

    
    [CmdletBinding()]
    [OutputType('System.Management.Automation.PSCustomObject')]
    param
    (
        [Alias("RunAs")]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential = [System.Management.Automation.PSCredential]::Empty,
        
        $ForestName = [System.DirectoryServices.ActiveDirectory.Forest]::Getcurrentforest()
    )
    
    PROCESS
    {
        TRY
        {
            IF ($PSBoundParameters['Credential'] -or $PSBoundParameters['ForestName'])
            {
                Write-Verbose '[PROCESS] Credential or FirstName specified'
                $Splatting = @{ }
                IF ($PSBoundParameters['Credential'])
                {
                    $Splatting.Credential = $Credential
                }
                IF ($PSBoundParameters['ForestName'])
                {
                    $Splatting.ForestName = $ForestName
                }
                
                # Forest Query
                $Forest = (Get-ADSIForest @splatting)
                
                # Domain Splatting cleanup
                $Splatting.Remove("ForestName")
                $Splatting.DomainName = $Forest.RootDomain.name
                
                # Domain Query
                $Domain = (Get-ADSIDomain @Splatting)
                
            }
            ELSE
            {
                $Forest = Get-ADSIForest
                $Domain = Get-ADSIDomain
            }
            
            [Pscustomobject][ordered]@{
                SchemaRoleOwner = $Forest.SchemaRoleOwner
                NamingRoleOwner = $Forest.NamingRoleOwner
                InfrastructureRoleOwner = $Domain.InfrastructureRoleOwner
                RidRoleOwner = $Domain.RidRoleOwner
                PdcRoleOwner = $Domain.PdcRoleOwner
            }
            
        }
        CATCH
        {
            Write-Warning -Message '[PROCESS] Something wrong happened!'
            Write-Warning -Message $error[0].Exception.Message
        }
    }
}