Files
exams/computer_networks/labs/lab1/code/netcfg_commented.ps1
2025-10-01 22:55:09 +03:00

87 lines
6.3 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

param(
[ValidateSet('DHCP','STATIC','INFO')] [string]$Mode, # параметр режима (DHCP/STATIC/INFO)
[string]$Interface = 'Ethernet', # сетевой интерфейс (Ethernet - значение по умолчанию)
[string]$IP, # ipv4 адрес
[string]$Mask, # маска подсети
[string]$Gateway, # шлюз
[string[]]$Dns # массив dns серверов
)
function MaskToPrefix($m){ # переводим маску в длину префикса (255.255.255.0 -> 24)
$b = ($m -split '\.') | ForEach-Object {[Convert]::ToString([int]$_,2).PadLeft(8,'0')} # сплитим по точкам и переводим в воьсмибитные числа (двоичные)
($b -join '' -split '1').Count - 1 | Out-Null # кусок тестов остался ((
($b -join '').ToCharArray() | Where-Object {$_ -eq '1'} | Measure-Object | Select-Object -ExpandProperty Count # считаем количество единиц
}
function EnsureInterface($alias){ # проверяем есть ли интерфейс с данным именем
$a = Get-NetAdapter -InterfaceAlias $alias -ErrorAction SilentlyContinue
if(-not $a){ throw "Interface not found: $alias" } # если нет, выбрасываем соответсвующую ошибку
}
function ConfigureDhcp($alias){ # проводим настройку через dhcp сервер
EnsureInterface $alias # проверяем есть ли интерфейс с таким именем
Set-NetIPInterface -InterfaceAlias $alias -AddressFamily IPv4 -Dhcp Enabled # включаем получение IP по DHCP
Set-DnsClientServerAddress -InterfaceAlias $alias -ResetServerAddresses # аналогично для dns
ipconfig /flushdns | Out-Null # очищаем dns кэш
}
function ConfigureStatic($alias,$ip,$mask,$gw,$dns){ # статическая настройка
EnsureInterface $alias # проверяем валидность имени интерфейса
$prefix = MaskToPrefix $mask # считаем префикс маски
Get-NetIPConfiguration -InterfaceAlias $alias | Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | Remove-NetIPAddress -Confirm:$false -ErrorAction SilentlyContinue # удалим существующие ip на этом интерфейсе
Get-NetIPConfiguration -InterfaceAlias $alias | Get-DnsClientServerAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | ForEach-Object { Set-DnsClientServerAddress -InterfaceAlias $alias -ResetServerAddresses } # сбрасываем текущие dns настройки
New-NetIPAddress -InterfaceAlias $alias -IPAddress $ip -PrefixLength $prefix -DefaultGateway $gw | Out-Null # создаем новый ip и шлюз
if($dns){ Set-DnsClientServerAddress -InterfaceAlias $alias -ServerAddresses $dns } # если заданы dns сервера, пропишем их
ipconfig /flushdns | Out-Null # чистим dns кэш
}
function ShowNicInfo($alias){ # выводим информацию о сетевом интерфейсе
$na = Get-NetAdapter -InterfaceAlias $alias -ErrorAction SilentlyContinue
if(-not $na){ throw "Interface not found: $alias" } # проверяем имя интерфейса
$adv = Get-NetAdapterAdvancedProperty -InterfaceDescription $na.InterfaceDescription -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -match 'Duplex|Speed|дуплекс|скорост' } # получаем расширенные свойства адаптера, ищем строки со словом Duplex/Speed
$info = [pscustomobject]@{
Name = $na.Name
InterfaceAlias = $na.InterfaceAlias
InterfaceDescription= $na.InterfaceDescription
Status = $na.Status
MediaConnection = $na.MediaConnectionState
LinkSpeed = $na.LinkSpeed
DuplexSetting = ($adv | Where-Object { $_.DisplayName -match 'Duplex|дуплекс' } | Select-Object -First 1 -ExpandProperty DisplayValue)
} # формируем объект с нужными полями
$info # и выводим его
}
# если параметр $Mode не передан, показываем меню выбора
if(-not $Mode){
Write-Host "1) DHCP 2) STATIC 3) INFO"
$sel = Read-Host "Select mode [1/2/3]"
if($sel -eq '1'){ $Mode='DHCP' }
elseif($sel -eq '2'){ $Mode='STATIC' }
elseif($sel -eq '3'){ $Mode='INFO' }
} # пользователь выбрал мод
if($Mode -eq 'DHCP'){
if(-not $PSBoundParameters.ContainsKey('Interface')){ $Interface = Read-Host "Interface alias (default: Ethernet)"; if([string]::IsNullOrWhiteSpace($Interface)){ $Interface='Ethernet' } } # если интерфейс не передан в качестве параметра, просим у пользователя
ConfigureDhcp -alias $Interface # вызывыаем настройку dhcp
Get-NetIPConfiguration -InterfaceAlias $Interface # показываем результат
exit
}
if($Mode -eq 'STATIC'){ # статическая конфигурация
if(-not $PSBoundParameters.ContainsKey('Interface')){ $Interface = Read-Host "Interface alias (default: Ethernet)"; if([string]::IsNullOrWhiteSpace($Interface)){ $Interface='Ethernet' } } # если интерфейс не передан, просим у пользователя
if(-not $IP){ $IP = Read-Host "IPv4 address" } # аналогично
if(-not $Mask){ $Mask = Read-Host "Subnet mask" } # аналогично
if(-not $Gateway){ $Gateway = Read-Host "Gateway" } # аналогично
if(-not $Dns){ $DnsStr = Read-Host "DNS (comma-separated, optional)"; if($DnsStr){ $Dns = $DnsStr -split '\s*,\s*' } } # аналогично
ConfigureStatic -alias $Interface -ip $IP -mask $Mask -gw $Gateway -dns $Dns # вызываем функцию статической настройки
Get-NetIPConfiguration -InterfaceAlias $Interface # показываем результат
exit
}
if($Mode -eq 'INFO'){
if(-not $PSBoundParameters.ContainsKey('Interface')){ $Interface = Read-Host "Interface alias (default: Ethernet)"; if([string]::IsNullOrWhiteSpace($Interface)){ $Interface='Ethernet' } } # если не задан интерфейс, спросим у юзера
ShowNicInfo -alias $Interface | Format-List # показываем результат
exit
}