Tom_Neverwinter icon

adaptable script tomagatchi

Tom_Neverwinter | PRO | 01/07/24 07:00:07 AM UTC | 0 ⭐ | 1512 👁️ | Never ⏰ | []
PowerShell |

6.6 KB

|

None

|

0 👍

/

0 👎

#Requires -Version 5
#Requires -RunAsAdministrator
[Cmdletbinding()]
Param (
    [switch]$EnableInternetConnectionSharing,
    [switch]$DisableInternetConnectionSharing,
    [switch]$SetPwnagotchiSubnet,
    [ipaddress]$ScopeAddress = '192.168.137.1',  # Default value, can be overridden
    [string]$SubnetPrefix = '192.168.137.'        # Default prefix, can be overridden
)
 
# Load helper functions
Function Create-HNetObjects {
    <#
    .SYNOPSIS
        A helper function that does the heavy lifting with NetCfg.HNetShare
    #>
    [Cmdletbinding()]
    Param (
        $InternetAdaptor = $(Select-NetAdaptor -Message "Please select your main ethernet adaptor with internet access that will be used for internet sharing."),
        $RNDISGadget = $(Select-NetAdaptor -Message "Please select your 'USB Ethernet/RNDIS Gadget' adaptor")
    )
    Begin {
        regsvr32.exe /s hnetcfg.dll
        $HNetShare = New-Object -ComObject HNetCfg.HNetShare
    }
    Process {
        if ($HNetShare.EnumEveryConnection -ne $null) {
            $InternetInt       = $HNetShare.EnumEveryConnection | Where-Object { $HNetShare.NetConnectionProps.Invoke($_).Name -eq ($InternetAdaptor).Name }
            $InternetIntConfig = $HNetShare.INetSharingConfigurationForINetConnection.Invoke($InternetInt)
            $RNDISInt          = $HNetShare.EnumEveryConnection | Where-Object { $HNetShare.NetConnectionProps.Invoke($_).Name -eq ($RNDISGadget).Name }
            $RNDISIntConfig    = $HNetShare.INetSharingConfigurationForINetConnection.Invoke($RNDISInt)
        }
    }
    End {
        Return $(New-Object -TypeName PSObject -Property @{InternetIntConfig=$InternetIntConfig;RNDISIntConfig=$RNDISIntConfig;})
    }
}
 
Function Enable-InternetConnectionSharing {
    <#
    .SYNOPSIS
        Enables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface.
    #>
    [Cmdletbinding()]
    $HNetObject = Create-HNetObjects
    $HNetObject.InternetIntConfig.EnableSharing(0)
    $HNetObject.RNDISIntConfig.EnableSharing(1)
    Write-Output "[x] Enabled Internet Connection Sharing."
}
 
Function Disable-InternetConnectionSharing {
    <#
    .SYNOPSIS
        Disables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface.
    #>
    [Cmdletbinding()]
    $HNetObject = $(Create-HNetObjects)
    $HNetObject.InternetIntConfig.DisableSharing()
    $HNetObject.RNDISIntConfig.DisableSharing()
    Write-Output "[x] Disabled Internet Connection Sharing."
}
 
Function Test-PwnagotchiSubnet {
    <#
    .SYNOPSIS
        Tests the registry for the correct ScopeAddress.
    #>
    [Cmdletbinding()]
    Try {
        $RegKeys = Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters -ErrorAction Stop
        If ($RegKeys.ScopeAddress -notlike "$SubnetPrefix*") {
            Write-Error "Internet Connection Sharing is not set to the expected subnet. Run Set-PwnagotchiSubnet with the correct parameters." -ErrorAction Stop
        }
    } Catch {
        Write-Error "Error accessing registry to check ICS subnet: $_" -ErrorAction Stop
    }
}
 
Function Set-PwnagotchiSubnet {
    <#
    .SYNOPSIS
        Set the registry for the correct ScopeAddress.
    #>
    [Cmdletbinding()]
    Param (
        [ipaddress]$ScopeAddress
    )
    Try {
        [void]([ipaddress]$ScopeAddress)
        [void]([byte[]] $ScopeAddress.split('.'))
    } Catch {
        Write-Error "$ScopeAddress is not a valid IP."
    }
    Try {
        Set-ItemProperty -Name ScopeAddress       -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\" -Value $ScopeAddress -ErrorAction Stop
        Set-ItemProperty -Name ScopeAddressBackup -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\" -Value $ScopeAddress -ErrorAction Stop
        Write-Warning "The Internet Connection Sharing subnet has been updated. A reboot of windows is required !"
    } Catch {
        $PSCmdlet.ThrowTerminatingError($PSItem)
    }
}
 
# Main Function
Function Setup-PwnagotchiNetwork {
    <#
    .SYNOPSIS
        Function to setup networking.
    #>
    Param (
        [switch]$EnableInternetConnectionSharing,
        [switch]$DisableInternetConnectionSharing,
        [switch]$SetPwnagotchiSubnet,
        $ScopeAddress = '192.168.2.1'  # Default to 192.168.2.1 for AT&T compatibility
    )
    Begin {
        Try {
            Write-Debug "Begin"
            $ErrorSplat=@{ErrorAction="stop"}
            Write-Debug "Testing subnet"
            Try {
                Test-PwnagotchiSubnet @ErrorSplat
            } Catch {
                If ($SetPwnagotchiSubnet) {
                    Write-Debug "Setting subnet"
                    Set-PwnagotchiSubnet -ScopeAddress $ScopeAddress @ErrorSplat
                } Else {
                    Write-Error "Internet Connection Sharing is not set to the expected subnet. Run this script with the -SetPwnagotchiSubnet to setup the network." -ErrorAction Stop
                }
            }
        } Catch {
            $PSCmdlet.ThrowTerminatingError($PSItem)
        }
    }
    Process {
        Write-Debug "Process"
        Try {
            If ($EnableInternetConnectionSharing) {
                Write-Debug "Enable network Sharing"
                Enable-InternetConnectionSharing @ErrorSplat
            } ElseIf ($DisableInternetConnectionSharing) {
                Write-Debug "Disable network Sharing"
                Disable-InternetConnectionSharing @ErrorSplat
            }
        } Catch {
            $PSCmdlet.ThrowTerminatingError($PSItem)
        }
    }
    End {
        Write-Debug "End"
        Try {
            # Nothing to return.
        } Catch {
            $PSCmdlet.ThrowTerminatingError($PSItem)
        }
    }
}
 
Function Select-NetAdaptor {
    <#
    .SYNOPSIS
        A menu function to select the correct network adaptors.
    #>
    Param (
        $Message
    )
    $Adaptors = Get-NetAdapter | Where-Object {$_.MediaConnectionState -eq 'Connected'} | Sort-Object LinkSpeed -Descending
    do { 
        Write-Host $Message
        $index = 1
        foreach ($Adaptor in $Adaptors) {
            Write-Host "[$index] $($Adaptor.Name), $($Adaptor.InterfaceDescription)"
            $index++
        }   
        $Selection = Read-Host "Number"
    } until ($Adaptors[$selection-1])
     Return $Adaptors[$selection-1]
}
 
# Dynamically create params for Setup-PwnagotchiNetwork function based on script input.
Setup-PwnagotchiNetwork @psBoundParameters
 

Comments