Get-ManualNetworkAdapterWinSecureDNS.psm1

#Requires -RunAsAdministrator
function Get-ManualNetworkAdapterWinSecureDNS {

    # Get the network adapters and their properties if their status is neither disabled, disconnected nor null
    $Adapters = Get-NetAdapter | Where-Object { $_.Status -ne 'Disabled' -and $null -ne $_.Status -and $_.Status -ne 'Disconnected' }
    # Get the maximum length of each property for formatting the output
    $NameLength = ($Adapters.Name | Measure-Object -Maximum -Property Length).Maximum + 2
    $DescriptionLength = ($Adapters.InterfaceDescription | Measure-Object -Maximum -Property Length).Maximum + 2
    $MacLength = ($Adapters.MacAddress | Measure-Object -Maximum -Property Length).Maximum + 2
    # Not used because manually setting the width for it
    # $StatusLength = ($Adapters.Status | Measure-Object -Maximum -Property Length).Maximum + 2
    $LinkLength = ($Adapters.LinkSpeed | Measure-Object -Maximum -Property Length).Maximum + 2

    # Creating a heading for the columns
    # Write the index of the adapter
    Write-Host ("{0,-5}" -f "#") -NoNewline -ForegroundColor Blue
    # Write the name of the adapter in cyan
    Write-Host ("|{0,-$NameLength}" -f "Name") -NoNewline -ForegroundColor Cyan
    # Write the interface description of the adapter in yellow
    Write-Host ("|{0,-$DescriptionLength}" -f "Description") -NoNewline -ForegroundColor Yellow
    # Write the MAC address of the adapter in green
    Write-Host ("|{0,-$MacLength}" -f "Mac Addr") -NoNewline -ForegroundColor Green
    # Write the status of the adapter in red
    Write-Host ("|{0,-8}" -f "Status") -NoNewline -ForegroundColor Red
    # Write the link speed of the adapter in magenta
    Write-Host ("|{0,-$LinkLength}" -f "Speed") -ForegroundColor Magenta

    # Loop through the adapters and display them in a table with colors
    for ($i = 0; $i -lt $Adapters.Count; $i++) {
        # Write the index of the adapter
        Write-Host ("{0,-5}" -f ($i + 1)) -NoNewline -ForegroundColor Blue
        # Write the name of the adapter in cyan
        Write-Host ("|{0,-$NameLength}" -f $Adapters[$i].Name) -NoNewline -ForegroundColor Cyan
        # Write the interface description of the adapter in yellow
        Write-Host ("|{0,-$DescriptionLength}" -f $Adapters[$i].InterfaceDescription) -NoNewline -ForegroundColor Yellow
        # Write the MAC address of the adapter in green
        Write-Host ("|{0,-$MacLength}" -f $Adapters[$i].MacAddress) -NoNewline -ForegroundColor Green
        # Write the status of the adapter in red
        Write-Host ("|{0,-8}" -f $Adapters[$i].Status) -NoNewline -ForegroundColor Red
        # Write the link speed of the adapter in magenta
        Write-Host ("|{0,-$LinkLength}" -f $Adapters[$i].LinkSpeed) -ForegroundColor Magenta
    }

    # Get the max count of available network adapters and add 1 to it, assign the number as exit value to break the loop when selected
    $ExitCodeAdapterSelection = $Adapters.Count + 1

    # Write an exit option at the end of the table
    Write-Host ("{0,-5}" -f "$ExitCodeAdapterSelection") -NoNewline -ForegroundColor DarkRed
    Write-Host "|Cancel" -ForegroundColor DarkRed

    # Define a function to validate the user input
    function Confirm-Choice {
        param($Choice)
        # Get an array of valid numbers from 1 to $ExitCodeAdapterSelection
        $ValidNumbers = 1..$ExitCodeAdapterSelection
        # Initialize a flag to indicate if the input is valid or not
        $IsValid = $false
        # Loop through each valid number and compare it with the input
        foreach ($Number in $ValidNumbers) {
            # If the input is equal to a valid number, set the flag to true and break the loop
            if ($Choice -eq $Number) {
                $IsValid = $true
                break
            }
        }
        # Return the flag value
        return $IsValid
    }

    # Prompt the user to enter the number of the adapter they want to select, or exit value to exit, until they enter a valid input
    do {
        $Choice = Read-Host "Enter the number of the adapter you want to select or press $ExitCodeAdapterSelection to Cancel`n"
        # Check if the input is valid using the Confirm-Choice function
        if (-not (Confirm-Choice $Choice)) {
            # Write an error message in red if invalid
            Write-Host "Invalid input. Please enter a number between 1 and $ExitCodeAdapterSelection." -ForegroundColor Red
        }
    } while (-not (Confirm-Choice $Choice))

    # Check if the user entered the exit value to break out of the loop
    if ($Choice -eq $ExitCodeAdapterSelection) {
        # Write a message in white and break out of the loop
        Write-Host "Exiting..." -ForegroundColor Magenta
        # Send False flag to the caller function to indicate that the user cancelled the operation
        return $false
        break
    }
    else {
        # Get the selected adapter from the array and display it
        $ActiveNetworkInterface = $Adapters[$Choice - 1]
        return $ActiveNetworkInterface
    }            
}