87 lines
6.3 KiB
PowerShell
87 lines
6.3 KiB
PowerShell
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
|
||
}
|
||
|