Проверьте, работает ли беспроводной адаптер перед сбросом
Есть ли простой способ доказать, работает ли сетевой адаптер? Возможно, какой-то IP-адрес, например localhost (127.0.0.1), всегда доступен независимо от того, к какой сети я подключен; только тот, который показывает, работает ли мой адаптер беспроводной сети? Или, может быть, есть какая-то простая диагностическая проверка, чтобы подтвердить это?
Я пометил этот вопрос как PowerShell, так как это мой предпочитаемый язык; но я могу найти способы интеграции с любыми другими решениями, которые могут быть предложены.
До сих пор пробовал
Я подумал о проверке свойств адаптера и обнаружил, что есть статус и IP; Я полагал, что если бы был назначенный IP или связанный статус, который доказал бы, что все работает; к сожалению, эти свойства blank
а также unknown
поэтому я не могу их использовать.
$adapter = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like '*Wireless*'}
$adapter.Status #returns 2; i.e. unknown
$adapter.NetworkAddresses #is blank
Фон
У меня возникла проблема, когда я переводил компьютер в спящий режим, когда он подключен к сети, а затем снова подключал его к сети, он больше не подключался, он теряет беспроводное соединение и требует перезагрузки адаптера. В этом посте упоминается та же проблема: Command / Powershell скрипт для сброса сетевого адаптера
Я надеюсь использовать приведенный выше код, чтобы автоматически решить проблему, запланировав запуск задачи, когда мой компьютер выйдет из приостановки (например, /questions/22764361/predposyilki-i-isklyucheniya/22764376#22764376).
Иногда я нахожусь в моей домашней сети, где единственным устройством для проверки связи является мой маршрутизатор, иногда я нахожусь в моей офисной сети, где есть ряд машин, на которые я могу пинговать, а иногда я буду в другом месте... Определение подходящего целевого кандидата для проверки необходимости перезагрузки сетевого адаптера путем проверки связи с внешним устройством является более сложным, чем идеальным.
Я хочу запустить тест перед сбросом, чтобы сбросить его только при необходимости. Также будет полезно проверить после завершения сброса, если я хочу поставить в очередь другие задачи, которые требуют присутствия в сети для завершения.
1 ответ
Кажется, класс WMI Win32_NetworkAdapter
имеет Availability
имущество. https://msdn.microsoft.com/en-us/library/aa394216(v=vs.85).aspx
Существует ряд значений, которые могут представлять "работающие"; на данный момент я пошел только со статусом 3
; то есть, где все работает на 100%, как и ожидалось / нет никаких опасений по поводу потенциальной деградации. Это может быть что-то, что стоит изменить в зависимости от сценария.
function Test-NetworkAdapter {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$AdapterNameMask
,
[Parameter(Mandatory = $false)]
[int[]]$HealthyStatusses = @(3) #100% working on full power; for list of other possible values, see https://msdn.microsoft.com/en-us/library/aa387884(v=vs.85).aspx
)
process {
Get-WmiObject -Class Win32_NetworkAdapter `
| Where-Object {$_.Name -like $AdapterNameMask} `
| Select-Object @{Name='Working';Expression={$healthyStatusses -contains $_.Availability}}
}
}
function Reset-NetworkAdapter {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$AdapterNameMask
)
process {
Get-WmiObject -Class Win32_NetworkAdapter `
| Where-Object {$_.Name -like $AdapterNameMask} `
| %{ #in case multiple matches, loop through all
$_.Disable()
$_.Enable()
}
}
}
[string]$wirelessAdapterMask = '*Wireless*'
#I could probably improve this to cope better should there be multiple matches / only resetting those with issues... but for now this meets my requirement
if (-not (Test-NetworkAdapter $wirelessAdapterMask)) {
Reset-NetworkAdapter $wirelessAdapterMask
}