public/Test-tADDomainControllerPorts.ps1

function Test-tADDomainControllerPorts{
<#
.SYNOPSIS
  Test port requirements for establishing DC communication.
 
.DESCRIPTION
  The CmdLet display diagnostig information about the port requirements for establishing DC to DC communication.
 
.PARAMETER ComputerName
  Specifies a computer name.
 
.EXAMPLE
  Test-tADDomainControllerPorts -ComputerName Server01
 
.EXAMPLE
  Test-tADDomainControllerPorts -ComputerName 'Server1','Server2'
#>

  [CmdletBinding()]
  Param(
    [Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]
    [string]$ComputerName
  )

  begin {

    $portTable = @{'LDAP' = 389;
      'LDAP SSL' = 636;
      'LDAP GC' = 3268;
      'LDAP GC SSL' = 3269;
      'Kerberos' = 88;
      'DNS' = 53;
      'SMB' = 445;
      'SMTP' = 25;
      'RPC' = 135;
      'DFSR' = 5722;
      'Kerberos change' = 464;
      'SOAP' = 9389;
      'DFSN' = 139
    }

    $Result = @()

  }

  Process {
    
    foreach ($port in $portTable.GetEnumerator()){
      [string]$portType = $port.key
      [int]$portValue = $port.value

      $TcpTest = Test-NetConnection -ComputerName $ComputerName -Port $portValue -InformationLevel Quiet

      $psObj = New-Object psobject
      Add-Member -InputObject $psObj -MemberType NoteProperty -Name 'ComputerName' -Value $ComputerName
      Add-Member -InputObject $psObj -MemberType NoteProperty -Name 'Type' -Value $portType
      Add-Member -InputObject $psObj -MemberType NoteProperty -Name 'Port' -Value $portValue
      Add-Member -InputObject $psObj -MemberType NoteProperty -Name 'TCPTestResult' -Value $TcpTest

      $Result += $psObj
    }

  }

  end {
    Return $Result
  }

}