Заметки о Windows и других программных продуктах Microsoft...

Как Windows определяет подключение к Интернету

Как Windows определяет подключение к Интернету

Наверняка каждый пользователь операционных систем Windows сталкивался с ситуацией, когда значок сетевого подключения в панели задач отображался с желтым треугольником, что означает отсутствие подключения к Интернету.

То же самое можно увидеть и в свойствах сетевого подключения. Каким же образом операционная система определяет, есть ли на данном сетевом интерфейсе соединение с Интернетом, или только доступ к локальной сети?

свойства сетевого подключения

 

А дело в том, что в операционных системах Microsoft начиная с Windows Vista есть такая функция, как индикатор статуса сетевого подключения (Network Connectivity Status Indicator, NCSI). Эта функция вызывается службой сведений о подключенных сетях (Network Awareness) при подключении к любой сети.

служба сведений о подключенных сетях

 

Для определения возможностей сети в NCSI есть множество различных методов, одним из которых является определение возможности выхода в Интернет. Проверка проводится в два этапа:

• При подключении к сети система посылает HTTP-запрос по адресу http://www.msftncsi.com/ncsi.txt. Это обычный текстовый файл, в котором содержится всего одна строка Microsoft NCSI. В случае успешного запроса от сервера должен прийти ответ с заголовком 200 ОК, содержащий эту строку;
• На втором этапе проверяется работоспособность службы DNS, для чего NCSI пытается разрешить в IP-адрес имя dns.msftncsi.com. Ожидаемое значение 131.107.255.255

По завершении проверки, если оба этапа были успешно пройдены, система считает что доступ в Интернет имеется. Если файл ncsi.txt недоступен, а dns.msftncsi.com не разрешается или разрешается с другим IP-адресом, то система сообщает о невозможности подключения к Интернет. В том случае, если ncsi.txt недоступен, но dns.msftncsi.com разрешается в правильный IP — система выдает сообщение о необходимости аутентификации через браузер.

Настройки NCSI находятся в системном реестре, в разделе HKLM\System\CurrentControlSet\Services\NlaSvc\Parameters\Internet, при желании их можно отредактировать. Вот наиболее важные параметры для IPv4 (для IPv6 просто добавляем префикс V6):

EnableActiveProbing — наличие автоматической проверки подключения к интернет (1 — проверка включена, 0 — отключена);
ActiveDNSProbeContent — IP-адрес для проверки DNS;
ActiveDNSProbeHost — имя хоста для проверки DNS;
ActiveWebProbeHost — адрес веб-сайта для проверки;
ActiveWebProbePath — путь к файлу проверки;
ActiveWebProbeContent — содержимое файла.

настройки реестра для службы сведений о подключенных сетях

 

Используя эти настройки, можно изменить дефолтные адреса на свои, и подняв веб-сервер, по его логам  отслеживать подключения нужных компьютеров. Впрочем, смысла особого в этом лично я не вижу.

 
 
Комментарии

Я вижу,что скриншоны показаны от Windows 8. А для Windows 7 тоже так должно быть в реестре?Меня беспокоят дубликаты с V6.

Да, для семерки все так же.

Спасибо ! У меня WinServer 2008 R2 настроен как шлюз (через общий доступ к Инету).
Инет есть и с сервера и у клиентов. А вот в свойствах сетевого подключения стоит желтый треугольник — Без подключения к Инету. Не знаете ли, как это исправить ?

Можно попробовать изменить настройки NCSI в реестре, например. Только зачем, если все работает 🙂

а вот я всегда меняю дефолт на рукамипрописанные, в этом есть свой плюс, пусть долбится, а вот уведомление не нужно!

therealman™

Если есть два сетевых интерфейса, можно выключить проверку только на одном?

Настройки применяются ко всем интерфейсам, изменить для одного нельзя.

какое событие и с каким кодом в виндовом журнале указывает на успешное подключение к интернету?

Не нашел такого. Есть событие 7036, которое уведомляет о том, что служба стартовала.

Мне нужно было сделать, чтобы при наличии интернета, автоматически подключалось vpn-соединение. в винде есть журнал, куда пишется куча всякой хрени, есть коды событий и т.д. и есть планировщик заданий. самым логичным было бы при событии подключения к инету — запускать задание на запуск vpn-соединения. я нашел в журнале приложений: Microsoft\Windows\NetworkProfile — куда пишутся события при подключениях и отключениях к различным сетям. и есть код события 10000. но этому коду соответствует несколько событий. по этому создать в планировщике простое событие не получится. Нужно создать настраиваемый триггер с фильтром по событию. и уже там в формате XML ручками написать код… у меня получился такой:

*[System[EventID=10000]]
and
*[EventData[
Data[@Name=’Name’]=’Сеть’
and
Data[@Name=’State’]=9
]]

</QueryList

воооот. как-то так.
если кто придумает лучший вариант, было бы не плохо. но прибегать к сторонним прогам не хочцца.

блин, html-теги режутся…
тогда так:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-NetworkProfile/Operational">
<Select Path="Microsoft-Windows-NetworkProfile/Operational">
*[System[EventID=10000]]
and
*[EventData[
Data[@Name='Name']='Сеть'
and
Data[@Name='State']=9
]]
</Select>
</Query>
</QueryList>

Как то сложно чересчур 🙂 Я бы добавил в планировщик скрипт, который запускается при старте (или при входе в систему) и проверяет доступность какого либо внешнего ресурса. При его доступности считаем, что подключение состоялось, выполняем нужную нам команду и завершаем работу.

проверка ресурса — это еще один лишний ping. но ведь винда и так сама проверяет (пингует) свой ресурс. зачем же плодить лишние процессы, когда можно воспользоваться результатом уже существующего? вопрос состоит в том: куда пишется информация о доступности интернета? дело осложняется еще и тем, что в винде по какой-то непонятной причине отсутствует общий поиск по журналам…

фсё! победил!
вообщем порядок действий:
— в планировщике создаем новую задачу
— в задаче создаем новый триггер.
— в параметрах триггера задаем «при событии», тип события — настраиваемое
— создаем фильтр события, переключаемся на вкладку XML, ставим галку «изменить запрос вручную»
— вставляем запрос:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-NCSI/Operational">
<Select Path="Microsoft-Windows-NCSI/Operational">
*[System[Provider[@Name='Microsoft-Windows-NCSI']
and
(EventID=4042)]
and
EventData[
Data[@Name='Capability']=2
and
Data[@Name='CapabilityChangeReason']=8
]]
</Select>
</Query>
</QueryList>

— теперь все это дело сохраняем, сохраняем сам триггер
— на закладке «действия» создаем новое действие. и в нем вставляем нужный скрипт подключения VPN. а можно и сразу написать:
в качестве программы указать: C:\Windows\system32\rasdial.exe
аргументы: «названиеVPNподключения» login password
— сохраняем задачу.

результат:
как только комп определил подключение к интернету, сразу запускается наше VPN-соединение.

bestkarlson

Я столкнулся с проблемой коннекта с YOTA после перезагрузки системы компа (через чёрный ви-фи))… TTL прописан по реестру, но блин каждый раз в первое подключение к сети получаю «бан на полчаса»… не выключая комп подключаюсь после без проблем… возможно отключение автопроверки винды на подключение трабла исчезнет… они точно знают, что подключилась винда, но после «слепнут»… (будем надеятся поможет…))