NSLookup in PowerShell löst immer einen RemoteException-Fehler aus

1470
Twisty Impersonator

Wenn ich nslookupvon einem PowerShell-Skript aus laufe, erhalte ich immer einen Fehler (der an die Konsole ausgegeben wird), obwohl die Suche erfolgreich ist:

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 

Dies scheint darauf zurückzuführen zu sein, dass die Antwort nicht verbindlich ist. Beim Nachschlagen eines autorisierenden DNS-Servers wird kein Fehler zurückgegeben.

Bei meinen Versuchen, selbst eine Lösung zu finden, fand ich diese SO-Antwort . Es wird vorgeschlagen, den Befehl Resolve-DNSName zu verwenden . Leider erfordert dies Windows 8.1 / Server 2012 R2. Einige der Systeme, auf denen mein Skript ausgeführt wird, sind Windows 7-Zeitalter.

Wie kann ich verhindern, dass dieser Fehler angezeigt wird?

Bonuspunkte zum Erläutern, warum PowerShell der Meinung ist, ein Fehler ist aufgetreten!

1
Sie können versuchen, `[System.Net.Dns] :: Resolve (" superuser.com ")` anstelle des Cmdlets `Resolve-DNSName` zu ​​verwenden. In Bezug auf "nslookup" wird interessanterweise kein Fehler in Posh 5 ausgelöst, sondern die "nicht autorisierende Antwort:" an die Konsole geleitet (obwohl die Ausgabe - wie in Ihrem Beispiel - der Variablen zugeordnet ist). WeatherForecastingRat vor 6 Jahren 0
Sie sollten dies verhindern können, wenn Sie am Anfang Ihres Skripts `$ ErrorActionPreference =" SilentlyContinue "` setzen. Beachten Sie, dass dadurch die Anzeige von Fehlern im Skript unterdrückt wird SimonS vor 6 Jahren 1
`$ MyOutput = nslookup -q = SOA superuser.com 2> $ null` sollte ausreichen, da` nslookup` die Meldung `Nicht autorisierende Antwort:` an stdERR sendet. Zum Beweis führen Sie `> NUL nslookup -q = SOA superuser.com` sowie` 2> NUL nslookup -q = SOA superuser.com` in einem geöffneten `cmd'-Fenster aus. JosefZ vor 6 Jahren 0
Wie aus den Kommentaren hervorgeht, variiert dies je nach Powershell-Version. Bei Verwendung von Version 5 kann die Zeile "Nicht autorisierende Antwort:" über die Weiterleitung "2> $ null" ausgeschlossen werden. Wenn Sie eine niedrigere Version verwenden, bei der ein Fehler ausgegeben wird, können Sie die $ ErrorActionPreference-Funktion ändern. Denke nicht, dass -ErrorAction hier verfügbar sein wird. Es gibt andere .NET-Alternativen, einschließlich `[System.Net.Dns] :: GetHostAddresses (" superuser.com ")`. root vor 6 Jahren 0
Es gibt auch einen alternativen PowerShell-Mann ... `Resolve-DNSName Testen Sie es, wann oder ob Sie jemals eine Chance haben und ob es für Ihre PS-Versionen in Ihrer Umgebung gilt. [Resolve-DNSName] (https://docs.microsoft.com/de-de/powershell/module/dnsclient/resolve-dnsname?view=winserver2012r2-ps) Pimp Juice IT vor 6 Jahren 0
@ITSnuggles Einige der Systeme, auf denen ich dies tue, sind Windows 7, und die Version von PS mit diesem Cmdlet kann auf diesem Betriebssystem nicht ausgeführt werden. :( Twisty Impersonator vor 6 Jahren 1

1 Antwort auf die Frage

1
Twisty Impersonator

Ignorieren Sie den Fehler der ausführbaren Datei, indem Sie ihn zu $ ​​null umleiten

Ihre ausführbare Datei sendet die Ausgabe an den STDERR-Stream. Sie können es unterdrücken, indem Sie es an die automatische Variable $ null weiterleiten:

nslookup.exe example.com 2>$null 

Anmerkungen:

  • Sie müssen zur PowerShell- $nullVariablen umleiten . PS lässt es nicht auf die alte Schule (dh 2>nul).

  • Die Umleitung zu $null ist schneller als mitOut-Null


Erläuterung

NSLookup sendet einen Teil seiner Ausgabe an den STDERR-Stream . Wenn eine Windows-Konsolenanwendung dies ausführt, meldet PowerShell dies als NativeCommandError- Fehler.

In der Eingabeaufforderung ausführen, um nslookup -q=SOA superuser.com 1>nul 2>conzu sehen, was NSLookup in STDERR schreibt:

Unverbindliche Antwort:

Genau dies gibt PowerShell in der ersten Zeile der Fehlermeldung zurück:

nslookup: Nicht autorisierende Antwort:
In Zeile: 1 Zeichen: 1
+ nslookup -q = ns example.com

Anscheinend gibt NSLookup einen Fehler zurück, wenn die Antwort Datensätze von einem nicht autorisierenden Nameserver enthält. In Ihrem Fall scheint dies jedoch kein Problem zu sein, sodass Sie den Fehler wie oben beschrieben ignorieren können.