NSLookup в PowerShell всегда выдает ошибку RemoteException

1358
Twisty Impersonator

Когда я запускаю nslookupиз скрипта PowerShell, я всегда получаю сообщение об ошибке (которое выводится на консоль), несмотря на то, что поиск завершается успешно:

PS C:\Windows\system32> $MyOutput = nslookup -q=SOA superuser.com 8.8.4.4 nslookup : Non-authoritative answer: At line:1 char:13 + $MyOutput = nslookup -q=SOA superuser.com 8.8.4.4 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (Non-authoritative answer::String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 

Похоже, это связано с тем, что ответ не является авторитетным. Выполнение поиска на авторитетном DNS-сервере не возвращает ошибку.

В моих попытках найти решение самостоятельно я нашел этот ТАК ответ . Он предлагает использовать команду Resolve-DNSName . К сожалению, для этого требуется Windows 8.1 / Server 2012 R2, а некоторые системы, на которых будет работать мой скрипт, относятся к Windows 7.

Как я могу предотвратить отображение этой ошибки?

Бонусные баллы за объяснение, почему PowerShell считает, что произошла ошибка!

1
вы можете попробовать использовать `[System.Net.Dns] :: Resolve (" superuser.com ")` вместо командлета `Resolve-DNSName`. Что касается `nslookup`, интересно, что он не выдает ошибку в Posh 5, а направляет` Non-authoritative answer: `на консоль (даже если вывод передается в переменную - как в вашем примере) WeatherForecastingRat 6 лет назад 0
Вы должны быть в состоянии предотвратить это, если в начале своего скрипта установите `$ ErrorActionPreference =" SilentlyContinue "`. Имейте в виду, что это исключит любую ошибку в отображаемом скрипте SimonS 6 лет назад 1
`$ MyOutput = nslookup -q = SOA superuser.com 2> $ null` должно быть достаточно, так как` nslookup` отправляет сообщение "Неавторизованный ответ:" в stdERR. Для доказательства запустите `> NUL nslookup -q = SOA superuser.com`, а также` 2> NUL nslookup -q = SOA superuser.com` из открытого окна `cmd`… JosefZ 6 лет назад 0
Как отмечается в комментариях, это зависит от версии Powershell. При использовании v5 строку «Неавторизованный ответ:» можно исключить с помощью перенаправления `2> $ null`. Если вы используете меньшую версию, где выводится ошибка, вы можете изменить `$ ErrorActionPreference`. Не думайте, что `-ErrorAction` будет доступен здесь. Существуют и другие альтернативы .NET, в том числе `[System.Net.Dns] :: GetHostAddresses (" superuser.com ")`. root 6 лет назад 0
Есть также альтернативный человек PowerShell .... `Resolve-DNSName `—Проверьте это, когда или если у вас когда-нибудь появится шанс, и примените ли он к вашим версиям PS в вашей среде. [Решимость-DNSName] (https://docs.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname?view=winserver2012r2-ps) Pimp Juice IT 6 лет назад 0
@ITSnuggles Некоторые из систем, на которых я делаю это, - Windows 7, и версия PS с этим командлетом не работает на этой ОС. :( Twisty Impersonator 6 лет назад 1

1 ответ на вопрос

1
Twisty Impersonator

Проигнорируйте ошибку исполняемого файла, перенаправив на $ null

Ваш исполняемый файл отправляет вывод в поток STDERR. Вы можете подавить его, перенаправив на автоматическую переменную $ null:

nslookup.exe example.com 2>$null 

Заметки:

  • Вы должны перенаправить в $nullпеременную PowerShell . PS не позволит вам сделать это по-старому (то есть 2>nul).

  • Перенаправление на $null быстрее, чем использованиеOut-Null


объяснение

NSLookup отправляет часть своего вывода в поток STDERR . Всякий раз, когда консольное приложение Windows делает это, PowerShell сообщает об этом как об ошибке NativeCommandError .

В командной nslookup -q=SOA superuser.com 1>nul 2>conстроке запустите, чтобы увидеть, что NSLookup пишет в STDERR:

Неофициальный ответ:

Это именно то , что PowerShell возвращает в первой строке своего сообщения об ошибке:

nslookup: неавторизованный ответ: в
строке: 1 символ: 1
+ nslookup -q = ns example.com

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