sergey vasin

The IT blog

Используем встроенную функцию PowerShell в Windows 8 вместо NSLookup – Hey, Scripting Guy! Blog

leave a comment »

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

Microsoft Scripting Guy, Ed Wilson на связи. Вчера я рассказывал об использовании PowerShell для диагностики клиентских настроек DNS. В частности я говорил об определении текущего сервера DNS и клиентском DNS-кеше.

Сегодня мы рассмотрим еще пару функций.

Разрешаем DNS имена

Для того, чтобы выполнить подключение, мне нужно разрешить имя хоста в IP-адрес. Хотя, если быть точным, не мне, а моему компьютеру. Но если имя не будет разрешено должным образом, мое приложение не будет работать. Зачастую, во время путешествий короткий звонок в техподдержку превращается в долгий и мучительный звонок в техподдержку.

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

«NSLookup» в PowerShell

К счастью мне не обязательно больше использовать NSLookup, поскольку Windows 8, Windows Server 2012 и даже Microsoft Surface обладают встроенным модулем DNSClient. Этот модуль содержит функцию Resolve-DNSName. Она работает просто замечательно (несмотря на тот факт, что сообщество полагает, что она должна называться Get-DNSName).

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

Resolve-DnsName www .scriptingguys.com

Команда и ее вывод приведены ниже.

14:28 C:\> Resolve-DnsName www .scriptingguys.com

Name Type TTL Section NameHost

—- —- — ——- ———

www. scriptingguys.com CNAME 3600 Answer scriptingguys.com

Name : scriptingguys.com

QueryType : A

TTL : 3600

Section : Answer

IP4Address : 64.4.11.37

Name : scriptingguys.com

QueryType : A

TTL : 3600

Section : Answer

IP4Address : 65.55.58.201

Name : scriptingguys.com

QueryType : SOA

TTL : 3600

Section : Authority

NameAdministrator : msnhst.microsoft.com

SerialNumber : 2012050301

TimeToZoneRefresh : 1800

TimeToZoneFailureRetry : 900

TimeToExpiration : 2419200

DefaultTTL : 3600

Что здесь интересно, так это то, что выводятся три различных объекта. Они приведены ниже.

14:30 C:\> Resolve-DnsName www .scriptingguys.com | gm -MemberType Properties | select typename -Unique

TypeName

———

Microsoft.DnsClient.Commands.DnsRecord_PTR

Microsoft.DnsClient.Commands.DnsRecord_A

Microsoft.DnsClient.Commands.DnsRecord_SOA

Если мне нужна только запись определенного типа, я могу указать параметр –Type.

14:34 C:\> Resolve-DnsName www .scriptingguys.com -Type ptr

Name Type TTL Section NameHost

—- —- — ——- ———

www .scriptingguys.com CNAME 3251 Answer scriptingguys.com

Name : scriptingguys.com

QueryType : SOA

TTL : 3251

Section : Authority

NameAdministrator : msnhst.microsoft.com

SerialNumber : 2012050301

TimeToZoneRefresh : 1800

TimeToZoneFailureRetry : 900

TimeToExpiration : 2419200

DefaultTTL : 3600

К сожалению, параметр –Type не поддерживает указание нескольких значений. Сообщение об ошибке не выводится, однако это ведет к непредсказуемым результатам. Если мне нужно получить записи нескольких типов, я укажу эти типы в виде массива и передам их по конвейеру через командлет Foreach-Object.

«ptr», «a» | % {Resolve-DnsName -Name www .scriptingguys.com -Type $_}

Эту же технику я могу использовать для разрешения нескольких имен. Ниже я запрашиваю запись CNAME для имен «www.microsoft.com» and «ftp.microsoft.com».

«www.microsoft.com», «ftp.microsoft.com» | % {Resolve-DnsName $_ -type cname}

Если я хочу проверить DNS-кеш на наличие определенных записей, это я тоже могу сделать с помощью функции Resolve-DnsName. Если такой записи в кеше не существует (например она удалена по таймауту), выводится сообщение об ошибке.

14:41 C:\> Resolve-DnsName ftp.microsoft.com -CacheOnly

Resolve-DnsName : ftp.microsoft.com : DNS record does not exist

At line:1 char:1

+ Resolve-DnsName ftp.microsoft.com -CacheOnly

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

   + CategoryInfo : ResourceUnavailable: (ftp.microsoft.com:String) [Resolve-DnsName], Win32Exception

   + FullyQualifiedErrorId : RECORD_DOES_NOT_EXIST,Microsoft.DnsClient.Commands.ResolveDnsName

Для проверки ответа, возвращаемого моим сервером DNS, я могу запросить его напрямую. Для этого существует несколько вариантов. Например, я могу указать, что хочу использовать только протокол DNS.

Resolve-DnsName ftp.microsoft.com –DnsOnly

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

14:45 C:\> Get-DnsClientServerAddress

InterfaceAlias Interface Address ServerAddresses

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

Local Area Connection* 14 33 IPv4 {}

Local Area Connection* 14 33 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

vEthernet (WirelessSwitch) 31 IPv4 {192.168.6.1, 64.134.255.2, 64.134…

vEthernet (WirelessSwitch) 31 IPv6 {}

isatap.owv.atl.wayport.net 44 IPv4 {192.168.6.1, 64.134.255.2, 64.134…

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

Local Area Connection* 12 25 IPv4 {}

Local Area Connection* 12 25 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

vEthernet (InternalSwitch) 19 IPv4 {192.168.3.100}

vEthernet (InternalSwitch) 19 IPv6 {}

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

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

Loopback Pseudo-Interface 1 1 IPv4 {}

Loopback Pseudo-Interface 1 1 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

Teredo Tunneling Pseudo-I… 34 IPv4 {}

Teredo Tunneling Pseudo-I… 34 IPv6 {}

6TO4 Adapter 39 IPv4 {}

6TO4 Adapter 39 IPv6 {}

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

14:46 C:\> Get-DnsClientServerAddress | ? serveraddresses

InterfaceAlias Interface Address ServerAddresses

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

Local Area Connection* 14 33 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

vEthernet (WirelessSwitch) 31 IPv4 {192.168.6.1, 64.134.255.2, 64.134…

isatap.owv.atl.wayport.net 44 IPv4 {192.168.6.1, 64.134.255.2, 64.134…

Local Area Connection* 12 25 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

vEthernet (InternalSwitch) 19 IPv4 {192.168.3.100}

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

Loopback Pseudo-Interface 1 1 IPv6 {fec0:0:0:ffff::1, fec0:0:0:ffff::…

После получения списка DNS-серверов я могу начать их проверять по отдельности. Для этого я использую параметр -Server и укажу адрес определенного сервера.

Resolve-DnsName www .msn.com -DnsOnly -Server 192.168.6.1

Кроме того, я могу указать DNS-сервер по его имени.

Resolve-DnsName www .msn.com -Server ns1.msft.net

Если я понимаю, что в моем кеше содержатся неверные записи DNS, я могу его очистить.

Clear-DnsClientCache

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/08/replace-nslookup-with-a-built-in-windows-8-powershell-function.aspx


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

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


Реклама

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

Январь 8, 2013 в 13:41

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

Tagged with

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s