NSLookup in PowerShell genera sempre l'errore RemoteException


2

Quando eseguo nslookupda uno script di PowerShell, ricevo sempre un errore (che viene inviato alla console) nonostante il fatto che la ricerca abbia esito positivo:

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

Ciò sembra essere causato dal fatto che la risposta non è autorevole. Effettuare una ricerca su un server DNS autorevole non restituisce un errore.

Nei miei tentativi di trovare una soluzione da solo, ho trovato questa risposta SO . Suggerisce di usare il comando Resolve-DNSName . Sfortunatamente ciò richiede Windows 8.1 / Server 2012 R2 e alcuni dei sistemi su cui verrà eseguito il mio script sono Windows 7-era.

Come posso impedire che questo errore venga visualizzato?

Punti bonus per spiegare perché PowerShell pensa che si sia verificato un errore!


puoi provare a utilizzare [System.Net.Dns]::Resolve("superuser.com")anziché il Resolve-DNSNamecmdlet. Per quanto riguarda nslookup, interessante notare che non sta generando un errore in Posh 5, ma dirige il Non-authoritative answer:verso la console (anche se l'output è valutato in variabile - proprio come nel tuo esempio)
WeatherForecastingRat

1
dovresti essere in grado di impedirlo, se imposti $ErrorActionPreference = "SilentlyContinue"all'inizio dello script. Tieni presente che questo eliminerà qualsiasi errore nello script dalla visualizzazione
SimonS,

$MyOutput = nslookup -q=SOA superuser.com 2>$nulldovrebbe bastare perché nslookuppubblica il Non-authoritative answer:messaggio su stdERR. Per la prova, corri >NUL nslookup -q=SOA superuser.compure 2>NUL nslookup -q=SOA superuser.comda una cmdfinestra aperta ...
JosefZ,

Come suggeriscono i commenti, questo varia a seconda della versione di Powershell. Se si utilizza v5, la Non-authoritative answer:linea può essere esclusa tramite il 2>$nullreindirizzamento. Se si utilizza una versione inferiore in cui viene generato un errore, è possibile modificare il $ErrorActionPreference. Non pensare -ErrorActionche sarà disponibile qui. Esistono altre alternative a .NET, tra cui [System.Net.Dns]::GetHostAddresses("superuser.com").
root

1
@ITSnuggles Alcuni dei sistemi su cui sto facendo questo sono Windows 7 e la versione di PS con quel cmdlet non funziona su quel sistema operativo. :(
Twisty Impersonator

Risposte:


1

Ignora l'errore dell'eseguibile reindirizzando a $ null

L'eseguibile sta inviando output allo stream STDERR. Puoi sopprimerlo reindirizzandolo alla variabile $ null automatica:

nslookup.exe example.com 2>$null

Gli appunti:

  • È necessario reindirizzare alla $nullvariabile di PowerShell . PS non ti permetterà di farlo alla vecchia maniera (es 2>nul.).

  • Il reindirizzamento a $null è più veloce dell'usoOut-Null


Spiegazione

NSLookup sta inviando una parte del suo output al flusso STDERR . Ogni volta che un'applicazione console Windows esegue questa operazione, PowerShell segnala questo come errore NativeCommandError .

Nel prompt dei comandi eseguire nslookup -q=SOA superuser.com 1>nul 2>conper vedere cosa sta scrivendo NSLookup su STDERR:

Risposta non autorevole:

Questo è esattamente ciò che PowerShell restituisce nella prima riga del suo messaggio di errore:

nslookup: risposta non autorevole:
alla riga: 1 carattere: 1
+ nslookup -q = ns example.com

Apparentemente NSLookup restituisce un errore quando la sua risposta include record da un server dei nomi non autorevole. Tuttavia, nel tuo caso questo non sembra essere un problema, quindi puoi ignorare l'errore come descritto sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.