Public/Get-ADSIFsmo.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
        }
    }
}