feat: static route manager for windows
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
PowerShell script for managing Windows static routes
|
||||
|
||||
.DESCRIPTION
|
||||
This script is used to add or remove static route entries in Windows systems.
|
||||
It supports using full subnet mask (Mask) or subnet mask length (MaskLen) to specify the mask.
|
||||
The script will automatically request administrator privileges to modify the system routing table.
|
||||
|
||||
.PARAMETER Add
|
||||
Used to add a new route record
|
||||
|
||||
.PARAMETER Remove
|
||||
Used to remove an existing route record
|
||||
|
||||
.PARAMETER Target
|
||||
Destination network address
|
||||
|
||||
.PARAMETER Mask
|
||||
Full format subnet mask (e.g.: 255.255.255.0)
|
||||
|
||||
.PARAMETER MaskLen
|
||||
Subnet mask length (e.g.: 24 represents 255.255.255.0)
|
||||
|
||||
.PARAMETER Gateway
|
||||
Gateway address
|
||||
|
||||
.EXAMPLE
|
||||
RouteManager.ps1 -Add -Target 192.168.12.0 -Mask 255.255.255.0 -Gateway 192.168.31.9
|
||||
|
||||
.EXAMPLE
|
||||
RouteManager.ps1 -Add -Target 192.168.12.0 -MaskLen 24 -Gateway 192.168.31.9
|
||||
|
||||
.EXAMPLE
|
||||
RouteManager.ps1 -Remove -Target 192.168.12.0 -Mask 255.255.255.0 -Gateway 192.168.31.9
|
||||
#>
|
||||
|
||||
[CmdletBinding(DefaultParameterSetName = "None")]
|
||||
param (
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Add")]
|
||||
[switch]$Add,
|
||||
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Remove")]
|
||||
[switch]$Remove,
|
||||
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Add")]
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Remove")]
|
||||
[ValidatePattern("^(\d{1,3}\.){3}\d{1,3}$")]
|
||||
[string]$Target,
|
||||
|
||||
[Parameter(ParameterSetName = "Add")]
|
||||
[Parameter(ParameterSetName = "Remove")]
|
||||
[ValidatePattern("^(\d{1,3}\.){3}\d{1,3}$")]
|
||||
[string]$Mask,
|
||||
|
||||
[Parameter(ParameterSetName = "Add")]
|
||||
[Parameter(ParameterSetName = "Remove")]
|
||||
[ValidateRange(0, 32)]
|
||||
[int]$MaskLen,
|
||||
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Add")]
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Remove")]
|
||||
[ValidatePattern("^(\d{1,3}\.){3}\d{1,3}$")]
|
||||
[string]$Gateway
|
||||
)
|
||||
|
||||
# Automatically request administrator privileges
|
||||
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) {
|
||||
# Restart the script with administrator privileges
|
||||
$scriptPath = $MyInvocation.MyCommand.Definition
|
||||
$arguments = $MyInvocation.BoundParameters.Keys | ForEach-Object {
|
||||
"-$_";
|
||||
if ($MyInvocation.BoundParameters[$_] -is [switch]) {
|
||||
if ($MyInvocation.BoundParameters[$_].IsPresent) { $null }
|
||||
} else {
|
||||
$MyInvocation.BoundParameters[$_]
|
||||
}
|
||||
}
|
||||
$arguments += $MyInvocation.UnboundArguments
|
||||
|
||||
Start-Process powershell.exe -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`" $arguments" -Verb RunAs
|
||||
exit
|
||||
}
|
||||
|
||||
# Function to validate IP address format
|
||||
function Test-IPAddress {
|
||||
param ([string]$IP)
|
||||
|
||||
try {
|
||||
$null = [System.Net.IPAddress]::Parse($IP)
|
||||
$octets = $IP -split '\.'
|
||||
foreach ($octet in $octets) {
|
||||
if ([int]$octet -gt 255) {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# Function to convert mask length to full subnet mask
|
||||
function ConvertTo-SubnetMask {
|
||||
param ([int]$MaskLength)
|
||||
|
||||
$mask = [UInt32]([Math]::Pow(2, $MaskLength) - 1) * [Math]::Pow(2, (32 - $MaskLength))
|
||||
$bytes = [BitConverter]::GetBytes([UInt32]$mask)
|
||||
[Array]::Reverse($bytes)
|
||||
return [String]::Join(".", $($bytes | ForEach-Object { [String]$_ }))
|
||||
}
|
||||
|
||||
# Main programme logic starts here
|
||||
# Validate IP address format
|
||||
if (-not (Test-IPAddress -IP $Target)) {
|
||||
Write-Error "Error: Destination address ($Target) format is invalid"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not (Test-IPAddress -IP $Gateway)) {
|
||||
Write-Error "Error: Gateway address ($Gateway) format is invalid"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Determine which subnet mask to use
|
||||
$useMask = $null
|
||||
if ($Mask) {
|
||||
if (-not (Test-IPAddress -IP $Mask)) {
|
||||
Write-Error "Error: Subnet mask ($Mask) format is invalid"
|
||||
exit 1
|
||||
}
|
||||
$useMask = $Mask
|
||||
}
|
||||
elseif ($MaskLen -ge 0) {
|
||||
$useMask = ConvertTo-SubnetMask -MaskLength $MaskLen
|
||||
}
|
||||
else {
|
||||
Write-Error "Error: You must specify either a subnet mask (Mask) or subnet mask length (MaskLen)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Execute add or remove route operation
|
||||
try {
|
||||
if ($Add) {
|
||||
Write-Verbose "Adding route: Destination=$Target, Mask=$useMask, Gateway=$Gateway"
|
||||
$result = route add $Target mask $useMask $Gateway
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host "Successfully added route: $Target via gateway $Gateway (mask: $useMask)"
|
||||
}
|
||||
else {
|
||||
Write-Error "Failed to add route: $result"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
elseif ($Remove) {
|
||||
Write-Verbose "Removing route: Destination=$Target, Mask=$useMask, Gateway=$Gateway"
|
||||
$result = route delete $Target mask $useMask
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host "Successfully removed route: $Target (mask: $useMask)"
|
||||
}
|
||||
else {
|
||||
Write-Error "Failed to remove route: $result"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error "An error occurred whilst executing route command: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
Reference in New Issue
Block a user