Главная

Sunday, 22 September 2024

PowerShell и Wi-Fi.

Всем привет.

Обычно все операции по настройке и выводу информации о сигналах Wi-Fi устройств в системе Windows происходят через окна, то есть графический интерфейс. Сегодня же рассмотрим, как можно применить командную строку PowerShell для отображения такой же и другой информации.   И пусть вас не смущает что в большинстве случаев будут использованы вызовы netsh-команд, которые по сути не являются командлетами PowerShell.

По правде говоря материал почти полностью заимствован из журнала "Системный администратор" №11 за 2021-й год у Сергея Болдина. Но подобное я находил и на других ресурсах сети.

Проверка уровня Wi-Fi сигнала 

Определить уровень сигнала сети (SSID) графически легко – посмотреть на иконку с полосками. Выполнив несложные команды в среде PowerShell, можно получить “цифровой” результат. 

Видимость 3-х полосок на иконке Wi-Fi сигнала говорит о хорошем качестве сигнала (уровень 75 до 100%), 2 полоски – качество среднего уровня (между 50 и 75%), 1 – плохой сигнал (ниже 50 %). Здесь не отображаются значения в виде цифр, зато такое точное значение можно получить с помощью команды: 

netsh wlan show interfaces

Если же нужно видеть только значение уровня сигнала, то другую информацию можно не выводить, указав соответствующие параметры:

(netsh wlan show interfaces) -Match '^\s+Signal' -Replace '^\s+Signal\s+:\s+',''

С помощью скрипта PowerShell можно для пользователя выводить всплывающее окно с уведомлением уровня сигнала, например, менее 25%:

$c_level=(netsh wlan show interfaces) -Match '^\s+Signal' -Replace '^\s+Signal\s+:\s+','' | Out-String

If ($c_level.replace('%','') –le 25)

{

Add-Type -AssemblyName System.Windows.Forms

$global:msg = New-Object System.Windows.Forms.NotifyIcon

$path = (Get-Process -id $pid).Path

$msg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)

$msg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning

$msg.BalloonTipText = “Уровень Wi-Fi сигнала менее $c_level,

Рекомендуем вернуться к точке доступа!”

$msg.BalloonTipTitle = "Внимание $Env:USERNAME"

$msg.Visible = $true

$msg.ShowBalloonTip(10000)

}

Замечание: рекомендация пользователю вернуться к точке доступа может прозвучать странно ибо ему не всегда известно где же та АР находится.) Тут на ваше усмотрение.

Вывод доступных беспроводных сетей

С  помощью  команд  в  консоли  PowerShell  можно  вывести список всех доступных ноутбуку беспроводных сетей с их характеристиками. Несложный вариант отображения списка доступных беспроводных сетей состоит из одной команды netsh с несколькими ключами и параметрами:

netsh wlan show network mode=bssid

Можно  пойти  дальше  и  выполнить  более  сложный  вариант – скрипт, который просканирует все доступные Wi-Fi сети, выведет их имена, уровень сигнала, номера каналов, стандарты и представит результат в табличном виде (для наглядного результата мы специально перешли в другое место с большим количеством точек доступа).


Увидеть пароли к Wi-Fi сетям

В  ОС  Windows  пароль  для  Wi-Fi  сети  может  сохраниться (по  желанию  пользователя),  чтобы  потом  автоматически подключаться  к  этой  сети  без  дополнительного  запроса на ввод пароля. 

С помощью командной строки PowerShell можно вывести не только пароль к текущему беспроводному соединению (как это делается с через графические окна), но и вообще все  пароли  Wi-Fi  сетей,  к  которым когда-либо подключался ваш ноутбук. При подключении к Wi-Fi сети ОС Windows создает для нее WLAN-профиль, содержащий имя (SSID), пароль (ключ безопасности) и другие параметры для подключения к точке доступа.  Windows  хранит  профили  Wi-Fi  сетей  в  каталоге %ProgramData%\Microsoft\Wlansvc\Profiles\Interfaces.

С  помощью  командной  строки  можно  вывести  список WLAN-профилей:

netsh wlan show profile

Чтобы  получить  информацию  по  конкретному  WLAN-профилю  и  сохраненный  пароль,  нужно  указать  его  SSID в командной строке:

netsh wlan show profile “HOUSE_RPT” key=clear

Сохраненный пароль Wi-Fi сети будет указан явно в поле Ключ безопасности.

А  если  WLAN-профилей  много?  В  этом  случае  можно вывести  список  всех  беспроводных  сетей  и  их  паролей, используя большее количество параметров преобразования и структурирования данных:

(netsh wlan show profiles) | Select-String "\:(.+)$" | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} | %{(netsh 

wlan show profile name="$name" key=clear)} | Select-String "Содержимое ключа\W+\:(.+)$" | %{$pass=$_.Matches.Groups[1].Value.Trim(); $_} | %{[PSCustomObject]@{ PROFILE_NAME=$name;PASSWORD=$pass }} | Format-Table –Wrap

Если необходимо иметь пароли к Wi-Fi сетям в быстром доступе, их можно сохранить в тестовый файл. Для этого к предыдущей команде нужно добавить:

| Format-Table -AutoSize | Out-File $env:USERPROFILE\Desktop\All_pass_WiFi.txt

Удаление беспроводной сети

Сохранённый  WLAN-профиль  можно  удалить  за  ненадобностью. Или в случае когда у знакомой точки доступа изменился пароль. Чтобы удалить (в ОС называется как "забыть") сохраненную Wi-Fi сеть из командной консоли PowerShell, нужно выполнить команду:

netsh wlan delete profile name=”HOUSE_RPT”

Если же требуется удалить сразу все сохранённые Wi-Fi сети, то вместо имени профиля нужно указать символ “*”:

netsh wlan delete profile name=*

И напоследок

Какими бы сложными не казались команды netsh но они отрабатвают стабильнее чем кликанье мышкой. Вот мой пример - моя вторая точка доступа(повторитель) подключается с 5-го раза если кликать в ней кнопку "Connect", но команда

netsh wlan connect name=HOUSE_RPT ssid=HOUSE_RPT interface="Wi-Fi 2"

поднимает соединение с первой попытки! Значения параметров name, ssid и interface вы легко найдете в выводе команд:

netsh wlan show profiles

netsh wlan show networks

netsh wlan show interfaces

Или иногда требуется сбросить адаптер  Wi-Fi, т.е. отключить его. А после включить. Тоже можно, но вначале надо узнать индекс вашего адаптера:

Get-NetAdapter -Physical -Name "Wi-Fi*" | fl 

Выключить его:

Get-NetAdapter -InterfaceIndex 20 | Disable-NetAdapter

И включить его по описанию, ибо выключенный адаптер индекса не имеет:

Enable-NetAdapter -InterfaceDescription "Broadcom 802.11n Network Adapter"

Удачи.

1 comment:

  1. netsh interface ip show interfaces - покажет индекс любого адаптера.

    ReplyDelete

А что вы думаете по этому поводу?