Modules/ADEHM.Connectivity.psm1

#requires -Version 5.1
<#
    ADEHM.Connectivity.psm1
    Basic availability checks: ping, DNS resolution, WinRM and FQDN.
#>


function Test-ADEHMPing {
    <#
        .SYNOPSIS
        Tests ICMP reachability of a server.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$ComputerName,
        [int]$TimeoutSeconds = 5
    )

    try {
        return [bool](Test-Connection -ComputerName $ComputerName -Count 2 -Quiet -ErrorAction Stop)
    }
    catch {
        return $false
    }
}

function Resolve-ADEHMDns {
    <#
        .SYNOPSIS
        Resolves a server's DNS name and returns its IP address.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$ComputerName
    )

    try {
        $resolved = Resolve-DnsName -Name $ComputerName -ErrorAction Stop
        $record = $resolved | Where-Object { $_.Type -in @('A', 'AAAA') } | Select-Object -First 1
        return [PSCustomObject]@{
            Success   = $true
            IPAddress = $record.IPAddress
        }
    }
    catch {
        return [PSCustomObject]@{
            Success   = $false
            IPAddress = $null
        }
    }
}

function Test-ADEHMWinRM {
    <#
        .SYNOPSIS
        Checks that the WinRM service responds on the target server.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$ComputerName,
        [int]$TimeoutSeconds = 10
    )

    try {
        $null = Test-WSMan -ComputerName $ComputerName -ErrorAction Stop
        return $true
    }
    catch {
        return $false
    }
}

function Get-ADEHMFQDN {
    <#
        .SYNOPSIS
        Returns the resolved FQDN of a server.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$ComputerName
    )

    try {
        return ([System.Net.Dns]::GetHostEntry($ComputerName)).HostName
    }
    catch {
        return $ComputerName
    }
}

Export-ModuleMember -Function Test-ADEHMPing, Resolve-ADEHMDns, Test-ADEHMWinRM, Get-ADEHMFQDN