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 }