Aktivieren Sie einen Einzeiler, um den Prozess in derselben Zeile wie den Port anzuzeigen, der die Netstat-Ausgabe verwendet
3339
Ric
Zuerst möchte ich nur sicherstellen, dass Benutzer Erik Bitemo den ursprünglichen Code, den ich hier verwende, gutschreibt. Die Ausgabe ist das, wonach ich suche, mit einer Ausnahme: Einer der Ports verschwindet und "System System5" erscheint an seiner Stelle, und ich kann nicht herausfinden, warum es passiert.
Ziel: Zeigen Sie alle TCP (Listening) - und UDP-Ports und den zugehörigen Prozess in derselben Zeile an.
TCP 0.0.0.0:135 0.0.0.0:07 HÖREN svchost TCP 0.0.0.0: System System5 0.0.0.0:07 HÖREN System TCP 0.0.0.0:623 0.0.0.0:08 LISTENING LMS
Der Port, den es ändert, ist 445, aber ich habe keine Ahnung, warum er nur diesen Port ändert, wenn die übrigen Ports wie beabsichtigt funktionieren. Warum ändert sich das Skript 445 in "System System5"?
Die Verwendung anderer Tools ist leider nicht möglich, daher bin ich auf die Verwendung von integrierten Windows-Tools beschränkt.
Bitte [bearbeiten] Sie die Frage und geben Sie die Rohausgabe von `netstat -bano | select-string 'LISTENING | UDP' 'an
DavidPostill vor 6 Jahren
0
3 Antworten auf die Frage
3
JosefZ
$pkönnte so etwas wie TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4und $nar[-1]ist string, 4so dass der -replaceOperator alle4 s nimmt:
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 ↑↑ ↑
Erzwinge das Ersetzen nur des letzten Vorkommens der $nar[-1]Verwendung des Endes des Linienankers (escape $):
… Und netstat -anosollte ausreichen (beachten Sie, dass diese -bOption zeitaufwändig sein kann und fehlschlägt, wenn Sie nicht über ausreichende Berechtigungen verfügen).
Sie haben das Problem mit Sicherheit gefunden. Ich habe auch Vorschläge für dieses Problem gemacht, wenn Sie neugierig sind.
Matt vor 6 Jahren
0
3
Matt
Die Antwort von JosefZ erklärt Ihr Problem perfekt. Sie verwenden Regex und tun genau das, was Sie möchten, und ersetzen vielleicht mehr als Sie erwartet haben.
Eine Randnotiz ist, dass Sie fragen netstatnach
Zeigt die ausführbare Datei an, die zum Erstellen der einzelnen Verbindungs- oder Überwachungsports benötigt wird
mit dem Schalter b. Sie verwerfen dies jedoch, select-stringda dieser Prozess in einer eigenen Zeile nach den anderen Daten angezeigt wird. Das ist nicht das Ende der Welt, sondern weil man Dinge wie kann -Contextvon Select-Stringbekommen, dass aber das muss genau einen späteren Zeitpunkt auf mehr betrachtet werden.
Ich möchte weitere Vorschläge dazu machen, was Sie in dieser Situation tun können.
Die Verwendung anderer Tools ist leider nicht möglich, daher bin ich auf die Verwendung von integrierten Windows-Tools beschränkt.
Lustig, haben Sie mindestens Windows 8? In diesem Get-NetTCPConnectionFall könnten Sie einfach das Cmdlet verwenden, das sich im Wesentlichen netstatin Objektform befindet.
So könnten Sie dies tun, wodurch Sie dieselben Informationen erhalten, ohne dass Sie sich darum kümmern müssen
Sie haben kein Windows 8+? Dann könnten wir Ihr Parsing-Skript verbessern. Wenn Sie beim Erstellen eines Objekts noch einen Schritt weitergehen, wird das Problem beim Regex-Abgleich vermieden.
netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{ $split = $_.Trim() -split "\s+" [pscustomobject][ordered]@{ "Proto" = $split[0] "Local Address" = $split[1] "Foreign Address" = $split[2] # Some might not have a state. Check to see if the last element is a number. If it is ignore it "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""} # The last element in every case will be a PID "Process Name" = $(Get-Process -Id $split[-1]).ProcessName } }
Wenn Sie auf PowerShell v2 beschränkt waren, müssen Sie das psobject und die bestellten Casts ändern
netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{ $split = $_.Trim() -split "\s+" New-Object -Type pscustomobject -Property @{ "Proto" = $split[0] "Local Address" = $split[1] "Foreign Address" = $split[2] # Some might not have a state. Check to see if the last element is a number. If it is ignore it "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""} # The last element in every case will be a PID "Process Name" = $(Get-Process -Id $split[-1]).ProcessName } } | Select "Proto", "Local Address", "Foreign Address", "State", "Process Name"
Die letzte selectAnweisung garantiert die Eigenschaftsreihenfolge, die andernfalls gemischt würde und dem funktionalen Äquivalent entspricht[ordered]
Also das wird Sie wie folgt ausgeben ...
Proto Local Address Foreign Address State Process Name ----- ------------- --------------- ----- ------------ TCP 0.0.0.0:135 0.0.0.0:0 LISTENING svchost TCP 0.0.0.0:445 0.0.0.0:0 LISTENING System TCP 0.0.0.0:1279 0.0.0.0:0 LISTENING PlexDlnaServer TCP 0.0.0.0:2869 0.0.0.0:0 LISTENING System
Das können Sie dann wie jedes PowerShell-Objekt behandeln und so filtern, wie Sie es für CSV oder für die Ausgabe in CSV oder für das, was Sie tun müssen, finden. Es ist jetzt strukturiert.
Abhängig von Ihrer PowerShell-Version können Sie auch verwenden, Convert-FromStringdass einzeilige Zeichenfolgen verwendet und in Objekte konvertiert werden. Noch etwas zum Nachschlagen.
Das war sehr hilfreich. Vielen Dank für Ihre Hilfe.
Ric vor 6 Jahren
0
Ihre Lösung wäre ideal, aber es scheint, dass mindestens Powershell 3 oder 4 erforderlich ist. Wenn sie auf einem Windows 7-Computer ausgeführt wird, tritt ein Fehler auf. Können Änderungen vorgenommen werden, um dies zu vermeiden? Der Fehler lautet "Typ kann nicht gefunden werden [bestellt]: Stellen Sie sicher, dass die Assembly mit diesem Typ geladen ist."
Ric vor 6 Jahren
0
Diese Abgüsse würden ein Problem mit Ja verursachen. Einfach zu adressieren. Ich werde ein kurzes Update für Sie hinzufügen.
Matt vor 6 Jahren
1
Die Prozessinformationen scheinen in Windows 2012 nicht verfügbar zu sein (nicht R2). Wahrscheinlich ist es auch in Windows 8.0 nicht verfügbar.
Thorarin vor 5 Jahren
0