Заметки о 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>

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