Files
shell-scripts/Windows/RouteManager.ps1
T
2025-04-10 09:27:38 +08:00

172 lines
5.1 KiB
PowerShell

<#
.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
}