Вы всё ещё пингуете подсети вручную? До сих пор открываете «Центр управления сетями» чтобы поменять IP?
Поздравляю: вы тратите 70% рабочего времени на то, что можно сделать одной командой.
PowerShell давно перестал быть «синей консолью для гиков». Это промышленный стандарт управления Windows-инфраструктурой. Microsoft планомерно вытесняет netsh и ipconfig, заменяя их объектно-ориентированными командлетами .
В этой статье — полный арсенал: от базовой диагностики до скриптов, которые сами пересоберут ARP-таблицу, настроят 200 компьютеров по имени хоста и отправят вам отчёт на почту.
1. Диагностика сети: перестаньте гадать, начните видеть
Классический подход: ping → ipconfig → tracert → nslookup. Работает. Но каждый раз вы получаете текст, который нужно парсить глазами.
PowerShell возвращает объекты. Это значит: фильтровать, сортировать и экспортировать можно одной строкой.
Get-NetIPAddress: вместо ipconfig /all
powershell
# Показать все IPv4-адреса (чисто, без тонны мусора)
Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress, PrefixLength
Что даёт:
Мгновенный обзор всех адаптеров. Никаких «DNS-суффиксов» и «автоконфигурации». Только суть .
Сценарий: К вам пришли с ноутбуком, который «не видит сеть». Первая команда. За 2 секунды видно: DHCP не дал адрес, висит APIPA (169.254.х.х). Диагноз готов.
Get-NetAdapter: контролируем железо
powershell
# Показать только активные Ethernet-адаптеры
Get-NetAdapter | Where-Object {$_.Status -eq "Up" -and $_.InterfaceDescription -like "*Ethernet*"}
Фишка: Видите LinkSpeed, MediaType, MAC-адрес. Если адаптер упал до 100 Мбит/с — сразу заметите .
Test-NetConnection: один командлет вместо трёх утилит
Это лучший друг сетевика. Заменяет ping, tracert, telnet и portqry одновременно .
powershell
# Проверить доступность порта 443 на целевом сервере
Test-NetConnection -ComputerName exchange.company.ru -Port 443
Вывод содержит всё:
- PingSucceeded: true/false
- RemotePort: 443
- TcpTestSucceeded: true (вот оно, главное!)
- InterfaceAlias: Ethernet0
Реальный кейс: Пользователь кричит: «1С не работает!». Вы не лезете на сервер, не ставите telnet. Просто:
powershell
Test-NetConnection -ComputerName 1c-server -Port 1541
Если порт закрыт — виноват админ сервера. Если открыт — проблема в клиенте. 5 секунд — и стрелка переведена .
Resolve-DnsName: nslookup на стероидах
powershell
# Узнать все MX-записи домена
Resolve-DnsName -Name mail.ru -Type MX
Возвращает объекты с приоритетами. Можно сразу скормить следующей команде .
2. Автоматизация массовых операций: один скрипт — сотня ПК
Здесь PowerShell раскрывается полностью. Забудьте про «пуск → выполнить → \PC01». Всё делается одной петлёй foreach.
Пинг всей подсети за 3 секунды
Вам нужен список живых устройств перед обновлением? Классический ping -a будет стучаться минуту.
Правильный способ:
powershell
1..254 | ForEach-Object {
$ip = "192.168.1.$_"
if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
[PSCustomObject]@{ IP = $ip; Status = "Active" }
}
} | Export-Csv -Path .\live_hosts.csv -NoTypeInformation
Что произошло:
Вы просканировали всю подсеть, получили CSV-файл с активными узлами. Можно импортировать в Excel, можно скормить следующему скрипту .
Массовая смена IP-адресов (по имени устройства)
Представьте: вы разворачиваете 50 новых тонких клиентов. У каждого должно быть строго своё место в IP-плане. Вручную — день работы. Скриптом — 5 минут.
Готовое решение (адаптировано из реального кейса) :
powershell
# Получаем имя текущего компьютера
$deviceName = $env:COMPUTERNAME
# Допустим, формат имени: NLUK0XXXXT0YY (где XXXX — номер подсети, YY — номер хоста)
if ($deviceName -match "^NLUK0(\d{4})T0(\d{2})$") {
$xxxx = $matches[1]
$yy = [int]$matches[2]
$xx1 = [int]$xxxx.Substring(0,2)
$xx2 = [int]$xxxx.Substring(2,2)
$staticIP = "10.$xx1.$xx2.$yy"
$gateway = "10.$xx1.$xx2.100"
# Назначаем IP
$adapter = Get-NetAdapter | Where-Object {$_.Status -eq "Up"} | Select-Object -First 1
New-NetIPAddress -InterfaceIndex $adapter.ifIndex `
-IPAddress $staticIP `
-PrefixLength 24 `
-DefaultGateway $gateway -ErrorAction SilentlyContinue
Set-DnsClientServerAddress -InterfaceIndex $adapter.ifIndex `
-ServerAddresses ("10.96.200.170","10.80.205.18")
}
Этот скрипт сам вычисляет свой IP по имени. Просто запустил — и компьютер оказался в нужной VLAN. Никакого ручного ввода .
Перезагрузка или выключение парка ПК
Есть список IP-адресов в файле? Скармливаем:
powershell
$computers = Get-Content "C:\temp\lab_pcs.txt"
$cred = Get-Credential
foreach ($pc in $computers) {
Restart-Computer -ComputerName $pc -Force -Credential $cred
Write-Host "Команда перезагрузки отправлена на $pc" -ForegroundColor Green
}
Важно: Restart-Computer умеет работать напрямую с IP-адресами. Никаких NetBIOS-имён .
3. Управление DHCP и DNS: мягкая сила
Принудительное обновление аренды DHCP
Иногда клиент «залипает» и не берёт новый адрес. Вместо ipconfig /release && ipconfig /renew:
powershell
$adapter = Get-NetAdapter -Name "Ethernet"
$wmi = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "Index=$($adapter.ifIndex)"
$wmi.ReleaseDHCPLease()
$wmi.RenewDHCPLease()
Метод старый (WMI), но работает безотказно, даже когда ipconfig падает с ошибкой .
Массовое назначение DNS-серверов
Нужно перевести 50 машин на новый DNS?
powershell
$computers = Get-Content "servers.txt"
$dnsServers = "10.10.10.10", "10.10.10.11"
foreach ($pc in $computers) {
Invoke-Command -ComputerName $pc -ScriptBlock {
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" `
-ServerAddresses $using:dnsServers
}
}
Используем Invoke-Command — команда выполняется на целевой машине, результат возвращается вам. Чисто, быстро, профессионально .
4. Мониторинг и оповещение: спим спокойно
PowerShell — отличный «сторожевой пёс». Он может крутиться в цикле и дёргать админа, если что-то пошло не так.
Проверка доступности критического узла с записью в лог
powershell
$logFile = "\\nas\logs\network_monitor.csv"
$targets = "8.8.8.8", "gw.company.ru", "dc01"
while ($true) {
foreach ($target in $targets) {
$result = Test-Connection -ComputerName $target -Count 2 -Quiet
$status = if ($result) { "OK" } else { "FAIL" }
[PSCustomObject]@{
Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Target = $target
Status = $status
} | Export-Csv -Path $logFile -Append -NoTypeInformation
}
Start-Sleep -Seconds 60
}
Этот скрипт вешается в фоне и каждую минуту проверяет связь с тремя узлами. При падении — запись в лог. Дальше можно настроить отправку на почту .
Интеграция с Telegram/Slack
PowerShell умеет ходить в REST API. Хотите уведомления в Telegram?
powershell
$token = "ваш_токен_бота"
$chatId = "ваш_chat_id"
$message = "⚠️ Сервер DC01 не отвечает на ping!"
$body = @{
chat_id = $chatId
text = $message
}
Invoke-RestMethod -Uri "https://api.telegram.org/bot$token/sendMessage" `
-Method Post `
-Body $body
Прикрутите это к предыдущему скрипту — и вы узнаете об аварии быстрее, чем её заметят пользователи .
5. Инвентаризация сети: собираем цифровые отпечатки
Построение карты ARP (IP + MAC)
Нужно быстро узнать, какие устройства висят в сети и как выглядят их MAC-адреса? Забудьте про ручной arp -a.
Промышленный сбор данных:
powershell
$outputFile = "C:\reports\NetworkDevices_$(Get-Date -Format 'yyyyMMdd').csv"
$networkDevices = @()
# Пингуем подсеть для заполнения ARP-кэша
1..254 | ForEach-Object {
$ip = "192.168.1.$_"
Test-Connection -ComputerName $ip -Count 1 -Quiet | Out-Null
}
# Парсим ARP-таблицу
$arpTable = arp -a | Select-String "192.168.1.\d{1,3}"
$arpTable | ForEach-Object {
if ($_ -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([a-fA-F0-9-]{17})") {
$networkDevices += [PSCustomObject]@{
IP = $matches[1]
MAC = $matches[2].Replace("-", ":")
}
}
}
$networkDevices | Export-Csv -Path $outputFile -NoTypeInformation
Write-Host "Готово. Отчёт: $outputFile" -ForegroundColor Green
Что мы сделали:
- Принудительно «простучали» всю сеть, чтобы ARP-кэш наполнился.
- Распарсили вывод arp -a (да, иногда без классики не обойтись).
- Получили CSV-файл с полной картой сети: IP → MAC .
Это можно запускать ежедневно через планировщик и отслеживать появление «левых» устройств.
Экспорт конфигурации всех сетевых адаптеров
powershell
Get-NetAdapter | Where-Object Status -eq "Up" | ForEach-Object {
$adapter = $_
$ipConfig = Get-NetIPAddress -InterfaceIndex $adapter.ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue
$dnsConfig = Get-DnsClientServerAddress -InterfaceIndex $adapter.ifIndex -ErrorAction SilentlyContinue
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
InterfaceName = $adapter.Name
IPAddress = $ipConfig.IPAddress -join ", "
MAC = $adapter.MacAddress
DNSServers = $dnsConfig.ServerAddresses -join ", "
LinkSpeed = $adapter.LinkSpeed
}
} | Export-Csv -Path "NetworkConfig_$env:COMPUTERNAME.csv" -NoTypeInformation -Encoding UTF8
Один файл — полная картина. Можно собирать с серверов, складывать в общую папку — и всегда знать, у кого что настроено .
6. PowerShell против классики: таблица превосходства
| Задача | Классический инструмент | PowerShell-командлет | Преимущество PowerShell |
| Показать IP | ipconfig | Get-NetIPAddress | Объекты, фильтрация, экспорт |
| Проверить порт | telnet | Test-NetConnection -Port | Не требует установки, скриптуемо |
| Пинг подсети | Цикл в cmd | 1..254 | ForEach-Object | В 10 раз быстрее, сразу CSV |
| ARP-таблица | arp -a | Парсинг + Test-Connection | Готовая инвентаризация |
| Смена IP | netsh | New-NetIPAddress | Работает на Server Core |
| DNS-запрос | nslookup | Resolve-DnsName | Объекты, все типы записей |
| Массовая операция | psexec | Invoke-Command | Встроено в PowerShell, без externals |
7. Боевые сценарии: от простого к сложному
Сценарий 1: «Пользователь не видит сетевой папки»
Алгоритм действий за 30 секунд:
powershell
# 1. ЕстьлиIP-адрес?
Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress
# 2. Виденлифайловыйсервер?
Test-Connection -ComputerName fileserver -Count 2
# 3. ОткрытлипортSMB?
Test-NetConnection -ComputerName fileserver -Port 445
# 4. Как резолвится имя?
Resolve-DnsName -Name fileserver
Диагноз готов. Чаще всего проблема в DNS или в том, что пользователь зашёл в гостевую Wi-Fi-сеть с другим профилем.
Сценарий 2: Подготовка 30 машин к внедрению новой VLAN
Вы получили задачу: перевести отдел продаж в новую подсеть 10.200.10.0/24. У всех ПК имена формата SALES-01…SALES-30.
Скрипт-убийца:
powershell
$vlanConfig = @{
Prefix = "SALES-"
NewSubnet = "10.200.10."
Gateway = "10.200.10.1"
DNS = @("10.200.10.10", "10.200.10.11")
}
1..30 | ForEach-Object {
$pcName = $vlanConfig.Prefix + $_.ToString("00")
$lastOctet = 100 + $_ # Чтобы не пересекаться со шлюзом
Invoke-Command -ComputerName $pcName -ScriptBlock {
$adapter = Get-NetAdapter | Where-Object {$_.Status -eq "Up"} | Select-Object -First 1
$ip = $using:vlanConfig.NewSubnet + $using:lastOctet
New-NetIPAddress -InterfaceIndex $adapter.ifIndex -IPAddress $ip -PrefixLength 24 -DefaultGateway $using:vlanConfig.Gateway -ErrorAction SilentlyContinue
Set-DnsClientServerAddress -InterfaceIndex $adapter.ifIndex -ServerAddresses $using:vlanConfig.DNS
} -Credential (Get-Credential "DOMAIN\it_admin")
}
Вы сидите с чашкой кофе, скрипт работает. Через 3 минуты 30 человек работают в новой подсети .
Заключение: PowerShell — это язык вашей карьеры
Сетевые инженеры делятся на два типа: те, кто использует PowerShell, и те, кто тратит время.
С появлением Server Core, Nano Server и Azure, графический интерфейс становится опцией, а консоль — стандартом. Microsoft сделала ставку на PowerShell ещё в 2016 году, и с тех пор только усиливает эту политику .
Что даёт вам PowerShell:
- Скорость: операции, занимавшие час, делаются за минуту.
- Точность: исключён человеческий фактор.
- Документирование: скрипт = готовый журнал изменений.
- Карьеру: PowerShell-гуру ценятся выше, чем «кликатели».
Начинайте с малого: замените сегодня один ipconfig на Get-NetIPAddress. Завтра добавьте Test-NetConnection в ежедневный обиход. Через неделю вы удивитесь, как вообще работали без всего этого.
Ваш компьютер — это API. PowerShell — язык, на котором вы с ним разговариваете. Пора заговорить бегло.
P.S. Готовый скрипт-«комбайн» для ежедневной диагностики
Сохраните это как Network-HealthCheck.ps1:
powershell
# PowerShell Network Health Check
$report = [System.Collections.ArrayList]::new()
$report.Add([PSCustomObject]@{
Timestamp = Get-Date
ComputerName = $env:COMPUTERNAME
IPAddresses = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -notlike "*Loopback*"} | ForEach-Object {$_.IPAddress}) -join ", "
DefaultGateway = (Get-NetRoute -DestinationPrefix "0.0.0.0/0").NextHop -join ", "
DNSServers = (Get-DnsClientServerAddress | Where-Object {$_.ServerAddresses} | ForEach-Object {$_.ServerAddresses}) -join ", "
InternetAccess = if (Test-Connection -ComputerName "8.8.8.8" -Count 1 -Quiet) { "Yes" } else { "No" }
DC_Access = if (Test-Connection -ComputerName (Get-ADDomainController).HostName -Count 1 -Quiet) { "Yes" } else { "No" }
}) | Out-Null
$report | Export-Csv -Path "C:\temp\Network_Health_$env:COMPUTERNAME.csv" -NoTypeInformation -Encoding UTF8
Запустите на всех серверах через Invoke-Command — и получите единый отчёт о здоровье сети. Через час, когда упал канал, вы скажете: «Я знаю, какие сервера потеряли связь». Не потому что вы ясновидящий. А потому что у вас есть скрипт.
Полезно почитать еще о PowerShell












