sergey vasin

The IT blog

Используем PowerShell для диагностики клиентских настроек DNS – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о диагностике клиентских настроек DNS при помощи Windows PowerShell.

Microsoft Scripting Guy, Ed Wilson на связи. Иногда во время путешествий получается так, что в отеле я сталкиваюсь с неполадками DNS.

В прошлом это означало, что мне нужно открыть командную строку и набрать несколько непростых команд. Но теперь все по-другому. На моем ноутбуке с Windows 8 (и даже на Windows Surface RT) я могу использовать функции модуля DnsClient.

И конечно в Windows PowerShell 3.0 (который присутствует на Windows 8, Windows Surface и Windows Server 2012) знание имени модуля, в котором находятся требуемые функции не является обязательным.

Получаем клиентские настройки DNS

Если у меня проблемы с подключением, и я подозреваю, что дело в DNS, первое, что я делаю, это смотрю, какие DNS-серверы использует мой компьютер. Для этого я могу воспользоваться функцией Get-DNSClient.

19:09 C:\> Get-DnsClient

InterfaceAlias Interface ConnectionSpecificSuffix ConnectionSpecificSuffixSearchList

————— ——— ———————— ———————

Local Area Connection* 14 33 {}

vEthernet (WirelessSwitch) 31 owv.atl.wayport.net {}

isatap.owv.atl.wayport.net 44 owv.atl.wayport.net {}

Local Area Connection* 12 25 {}

vEthernet (InternalSwitch) 19 {}

isatap.{FC2087E9-6988-45E… 40 {}

Loopback Pseudo-Interface 1 1 {}

Teredo Tunneling Pseudo-I… 34 {}

6TO4 Adapter 39 {}

Функция выводит довольно много информации. Даже слишком много. Один из способов отфильтровать данные – вывести только те подключения, которые обладают суффиксом подключения.

19:09 C:\> Get-DnsClient | ? connectionspecificsuffix

InterfaceAlias Interface ConnectionSpecificSuffix ConnectionSpecificSuffixSearchList

————— ——— ———————— ———————

vEthernet (WirelessSwitch) 31 owv.atl.wayport.net {}

isatap.owv.atl.wayport.net 44 owv.atl.wayport.net {}

Если мне нужно определить сетевой адаптер для конкретного сетевого интерфейса, я передам результаты функции Get-NetAdapter.

Заметка: На моем ноутбуке не существует интерфейса 44, поэтому командлет возвращает ошибку. Для подавления сообщений об ошибках укажите ErrorAction равным 0.

19:10 C:\> Get-DnsClient | ? connectionspecificsuffix | Get-NetAdapter

Get-NetAdapter : No MSFT_NetAdapter objects found with property ‘InterfaceIndex’

equal to ’44’. Verify the value of the property and retry.

At line:1 char:46

+ Get-DnsClient | ? connectionspecificsuffix | Get-NetAdapter

+ ~~~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (44:UInt32) [Get-NetAdapter], CimJobE

xception

+ FullyQualifiedErrorId : CmdletizationQuery_NotFound_InterfaceIndex,Get-NetAdapter

Name InterfaceDescription ifIndex Status

—- ——————— ——- ——

vEthernet (WirelessSwi… Hyper-V Virtual Ethernet Adapter #4 31 Up

Используем PowerShell для проверки DNS-кеша

После того, как я определил, что мой компьютер получил адрес DNS-сервера, я собираюсь просмотреть DNS-кеш. Для этого я воспользуюсь функцией Get-DNSCache.

Заметка: Использование функции Get-DNSCache не требует административных прав.

19:12 C:\> Get-DnsClientCache

Entry RecordNameType Record Status Section TimeToLive

—— ———- —— —— ——- ——

sxp.microsoft.com sxp.microsoft.com CNAME Success Answer 4

ajax.aspnetcdn.com ajax.aspnetcdn.com CNAME Success Answer 293

www .facebook.com www .facebook.com CNAME Success Answer 53

Особую ценность здесь представляет пара вещей. Одна из них – это TTL. TTL (Time-to-Live) – это время жизни записи в кеше. Благодаря этому полю я знаю, что запись sxp.microsoft.com будет находиться в кеше еще 4 секунды, а запись www .facebook.com – 53 секунды.

Запись CNAME представляет из себя каноническое имя, или алиас домена DNS. Эта информация полезна тем, что благодаря ей я знаю, что доменное имя – это не настоящее имя сервера. Если я не могу подключиться к серверу используя алиас, я знаю где я могу посмотреть, работает ли сервер вообще.

Ниже приведен пример записи CNAME. Я передал конкретную запись из выходных данных функции Get-DNSClientName командлету Format-List. Сделал я это для того, чтобы получить всю имеющуюся информацию.

12:35 C:\> (Get-DnsClientCache)[0] | fl *

TTL : 169

Caption :

Description :

ElementName :

InstanceID :

Data : prod.us.moneycentral.money.glbdns.microsoft.com

DataLength : 8

Entry : moneycentral.msn.com

Name : moneycentral.msn.com

Section : 1

Status : 0

TimeToLive : 169

Type : 5

PSComputerName :

CimClass : ROOT/StandardCimv2:MSFT_DNSClientCache

CimInstanceProperties : {Caption, Description, ElementName, InstanceID…}

CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties

Находим отсутствующие записи

Чем хороша функция Get-DNSClientCache, этак это тем, что это PowerShell, а значит все что она возвращает – это объекты, и я могу с легкостью их проанализировать. Приведенный ниже вывод свидетельствует об отсутствии нескольких записей – это вполне может быть источником проблемы.

12:51 C:\> Get-DnsClientCache

Entry RecordNameType Record Status Section TimeToLive

—— ———- —— —— ——- ——

ots.optimize.webtrends… ots.optimize.webtrends… CNAME Success Answer 100

_ldap._tcp.charlottesi… SRV NoRecords

_ldap._tcp.dc._msdcs.i… SRV NoRecords

Но если список содержимого кеша достаточно велик, идентификация отсутствующих записей может стать довольно непростым делом. Поэтому имеет смысл отфильтровать вывод посредством командлета Filter-Object.

12:55 C:\> Get-DnsClientCache | ? status -eq ‘NoRecords’

12:55 C:\>

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

12:55 C:\> Get-DnsClientCache | Format-List -Property * -Force

TTL : 0

Caption :

Description :

ElementName :

InstanceID :

Data :

DataLength : 0

Entry : _ldap._tcp.charlottesite._sites.dc._msdcs.iammred.net

Name :

Section : 0

Status : 9501

TimeToLive : 0

Type : 33

PSComputerName :

CimClass : ROOT/StandardCimv2:MSFT_DNSClientCache

CimInstanceProperties : {Caption, Description, ElementName, InstanceID…}

CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties

Изучив вывод можно заметить, что значение свойства статус на самом деле равно 9501, а не «NoRecords». Изменив фильтр, я получу всю необходимую мне информацию.

12:58 C:\> Get-DnsClientCache | ? status -eq 9501

Entry RecordNameType Record Status Section TimeToLive

—— ———- —— —— ——- ——

_ldap._tcp.charlottesi… SRV NoRecords

_ldap._tcp.dc._msdcs.i… SRV NoRecords

_ldap._tcp.5765f6d1-cb… SRV NoRecords

12:58 C:\>

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/07/use-powershell-to-troubleshoot-client-dns.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Январь 8, 2013 в 12:20

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s