iceage
Goto Top

Batch - Port eines Programmes finden und in Variable übergeben

Hallo und einen wunderschönen guten Abend,

gibt es eine Möglichkeit mit Hilfe einer Batch-Datei (Win10) den Port eines Programmes zu finden und in eine Variable zu übergeben?

Mit folgendem Schnipsel schaffe ich es zumindest schon mal nach firefox.exe in der netstat-Ausgabe zu suchen.

netstat -nb | findstr /s /i firefox.exe

Leider steht der Port in der nachfolgenden Zeile. Ich versuche den Port z.B. von firefox.exe in die Variable $Port zu übergeben, damit ich mit dieser Information weiter arbeiten kann.

Könnte mir hier jemand unter die Arme greifen??

Danke und Grüße I.

Content-ID: 561102

Url: https://administrator.de/contentid/561102

Ausgedruckt am: 21.11.2024 um 18:11 Uhr

erikro
erikro 26.03.2020 um 19:47:00 Uhr
Goto Top
Moin,

was auch immer Du da machen willst, mache es mit Powershell. Danke für die Frage. Ich habe das hier gefunden:
https://lazywinadmin.com/2011/02/how-to-find-running-processes-and-their ...

Leider sind da Typos in dem Quellcode. Deshalb hier nochmal korrigiert:

function Get-NetworkStatistics
{
 $properties = 'Protocol','LocalAddress','LocalPort'  
 $properties += 'RemoteAddress','RemotePort','State','ProcessName','PID'  

 netstat -ano |Select-String -Pattern '\s+(TCP|UDP)' | ForEach-Object {  

 $item = $_.line.split(" ",[System.StringSplitOptions]::RemoveEmptyEntries)  

 if($item[1] -notmatch '^\[::')  
 {
 if (($la = $item[1] -as [ipaddress]).AddressFamily -eq 'InterNetworkV6')  
 {
 $localAddress = $la.IPAddressToString
 $localPort = $item[1].split('\]:')[-1]  
 }
 else
 {
 $localAddress = $item[1].split(':')  
 $localPort = $item[1].split(':')[-1]  
 }

 if (($ra = $item[2] -as [ipaddress]).AddressFamily -eq 'InterNetworkV6')  
 {
 $remoteAddress = $ra.IPAddressToString
 $remotePort = $item[2].split('\]:')[-1]  
 }
 else
 {
 $remoteAddress = $item[2].split(':')  
 $remotePort = $item[2].split(':')[-1]  
 }

New-Object PSObject -Property @{
 PID = $item[-1]
 ProcessName = (Get-Process -Id $item[-1] -ErrorAction SilentlyContinue).Name
 Protocol = $item
 LocalAddress = $localAddress
 LocalPort = $localPort
 RemoteAddress =$remoteAddress
 RemotePort = $remotePort
 State = if($item -eq 'tcp') {$item[3]} else {$null}  
 } |Select-Object -Property $properties
 }
 }
}

Das ist die Ausgabe:

PS C:\WINDOWS\system32> Get-NetworkStatistics | ?{$_.processname -like "*firefox*"} |format-table  

Protocol LocalAddress   LocalPort RemoteAddress RemotePort State       ProcessName PID
-------- ------------   --------- ------------- ---------- -----       ----------- ---
TCP      127.0.0.1      52766     127.0.0.1     52767      HERGESTELLT firefox     11652
TCP      127.0.0.1      52767     127.0.0.1     52766      HERGESTELLT firefox     11652
TCP      127.0.0.1      53111     127.0.0.1     53112      HERGESTELLT firefox     10340
TCP      127.0.0.1      53112     127.0.0.1     53111      HERGESTELLT firefox     10340
TCP      127.0.0.1      54405     127.0.0.1     54406      HERGESTELLT firefox     9152
TCP      127.0.0.1      54406     127.0.0.1     54405      HERGESTELLT firefox     9152
TCP      127.0.0.1      54411     127.0.0.1     54412      HERGESTELLT firefox     4276
TCP      127.0.0.1      54412     127.0.0.1     54411      HERGESTELLT firefox     4276
TCP      127.0.0.1      58471     127.0.0.1     58472      HERGESTELLT firefox     12268
TCP      127.0.0.1      58472     127.0.0.1     58471      HERGESTELLT firefox     12268
TCP      127.0.0.1      58473     127.0.0.1     58474      HERGESTELLT firefox     6516
TCP      127.0.0.1      58474     127.0.0.1     58473      HERGESTELLT firefox     6516
TCP      127.0.0.1      58478     127.0.0.1     58479      HERGESTELLT firefox     10264
TCP      127.0.0.1      58479     127.0.0.1     58478      HERGESTELLT firefox     10264
TCP      192.168.178.23 58492     34.213.211.99 443        HERGESTELLT firefox     12268

Toll! Gefällt mir. Das kannst Du dann z. B. so weiterverarbeiten:

$firefox_ports = $(get-networkstatistics | where-object{$_.processname -like *firefox*})
foreach($port in $firefox_ports) {

#wasimmer Du damit anstellen willst.

}

hth

Erik
IceAge
IceAge 26.03.2020 um 19:56:20 Uhr
Goto Top
Hallo Erik,

danke für deine Antwort. Es muss leider unbedingt eine Batch sein, da das Ermitteln des Ports eine bestehende Batch erweitern soll. Kann man den Powershell-Part auch in eine Batch integrieren?
DerWoWusste
DerWoWusste 27.03.2020 um 13:12:36 Uhr
Goto Top
Moin.

Was soll das werden, wenn's fertig ist?
Firefox lauscht selbst nicht, deshalb frage ich.
erikro
erikro 27.03.2020 um 17:39:02 Uhr
Goto Top
Ich vermute mal, FF ist ein unverfängliches Beispiel. face-wink
erikro
erikro 27.03.2020 um 17:42:26 Uhr
Goto Top
Moin,

Du kannst aus einem Batch heraus ein PS-Skript starten und umgekehrt aus der PS ein Batch. Beim Start kannst Du auch Variablen übergeben. Bei der Aufgabenstellung tendiere ich dazu, das Batch aus der PS heraus zu starten. Ich würde aber immer überlegen, das Ganze in PS zu überführen. Spätestens bei der nächsten Änderung wirst Du froh sein. Batch ist sowas von ekelig. Da programmiere ich doch lieber in Assembler. face-wink

Liebe Grüße

Erik
IceAge
IceAge 27.03.2020 um 20:21:14 Uhr
Goto Top
Hallo und guten Abend,

es ist richtig, firefox.exe ist nur ein Beispiel. Die Idee wäre gewesen den variablen Port welcher bei RDP Shadowing genutzt wird zu ermitteln und in einem Skript über einen SSH-Tunnel weiterzuleiten.

Grüße I.
DerWoWusste
DerWoWusste 28.03.2020 um 00:37:39 Uhr
Goto Top
Und wozu? Was soll das sicherer machen, falls das die Absicht sein sollte?
IceAge
IceAge 28.03.2020 um 10:19:56 Uhr
Goto Top
Hallo,

geht weniger um das Thema Sicherheit. Schau mal hier rein ... da habe ich die Hintergründe zusammengeschrieben.

Grüße I.
DerWoWusste
DerWoWusste 28.03.2020 um 13:51:17 Uhr
Goto Top
Hi.

Das beruht ja auf meinem Wissensbeitrag.
Ich werde meinen Wissensbeitrag anpassen müssen, denn es ist ein Fehler drin: Port 445 muss am Remoterechner zum Supporter hin offen sein. In meinen Tests muss ich einen Fehler gemacht haben. Ist das evtl. dein Problem? Ich habe noch einmal getestet: wenn 445 nicht erreichbar ist, bekommt der Supporter bei mir "This computername is invalid".

Bei deinem "variablen Port"redest Du ja über die Highports, die von der rdpsa.exe geöffnet werden. Diese werden erst dann geöffnet, wenn der Hilfesuchende die Verbindungsanfrage bereits angenommen hat. Sie werden auch nach beenden der Verbindung sofort wieder geschlossen. Dein Plan kann also nicht gelingen.

Prüfe bitte, ob 445 offen ist und wenn nicht, ob es nach Öffnen geht. Du musst wohl oder übel für Euer VPN auch alle Highports zulassen.
IceAge
IceAge 28.03.2020 aktualisiert um 15:08:43 Uhr
Goto Top
Hallo,

klappt leider auch nicht, wenn ich den Port 445 weiterleite. Firewall ist zu Testzwecken mal komplett offen. Es ist kein klassisches VPN, ich baue eine Reverse-SSH Verbindung vom Client aus auf.
DerWoWusste
DerWoWusste 28.03.2020 um 15:19:33 Uhr
Goto Top
Teste mal am PC dessen, der helfen will
Qwinsta /Server:NameZielrechner
Lister dir das denn die Sitzungen überhaupt auf?
IceAge
IceAge 28.03.2020 aktualisiert um 16:05:22 Uhr
Goto Top
Klappt leider nicht. Ich erhalte den Fehler 1722 Beim Abrufen der Sitzungsnamen. RPC-Server ist nicht verfügbar. Brauche ich neben 445 vielleicht doch noch weitere Ports?
DerWoWusste
DerWoWusste 28.03.2020 aktualisiert um 16:28:13 Uhr
Goto Top
Hast du mit
Telnet Zielrechner 445
überhaupt sichergestellt, dass der Port erreichbar ist? Muss an der Windows-Firewall auch geöffnet werden.
IceAge
IceAge 28.03.2020 aktualisiert um 18:16:15 Uhr
Goto Top
Mhmm, irgendwas passt da nicht. Ich habe AdminPC und ClientPC testweise in das gleiche Netzwerk genommen um den SSH-Tunnel erstmal als Fehlerquelle ausschließen zu können.

AdminPC: 192.168.200.100 (Win10 Prof Version 1903 Build 18362.657)
ClientPC: 192.168.200.105 (Win10 Prof Version 1809 Build 17763.1039)

Ich kann vom AdminPC auch eine normale RDP Verbindung zum ClientPC aufbauen. Wenn ich nun am AdminPC folgendes versuche:
qwinsta /server:192.168.200.105
erhalte ich:
Fehler 5 beim Abrufen der Sitzungsnamen / Fehler [5]:Zugriff verweigert

Wenn ich direkt versuche die Verbindung aufzubauen, erhalte ich den Fehler "Spiegelungsfehler / Zugriff verweigert".
 mstsc /v:192.168.200.105 /shadow:1 /control 
IceAge
IceAge 28.03.2020 aktualisiert um 22:38:20 Uhr
Goto Top
hab jetzt testweise noch einen weiteren AdminPC (AdminPC2) ins Netzwerk aufgenommen. Auch hier ist Win10 Prof (Version 1909 Build 18363.592) installiert. Dann habe ich folgendes probiert:

AdminPC -> ClientPC >> keine Verbindung (Zugriff verweigert)
AdminPC2 -> ClientPC >> keine Verbindung (Zugriff verweigert)
AdminPC -> AdminPC2 >> keine Verbindung (Zugriff verweigert)
ClientPC -> AdminPC2 >> keine Verbindung (Zugriff verweigert)

Normale RDP Verbindungen funktionieren zuverlässig.
DerWoWusste
DerWoWusste 28.03.2020 um 23:10:04 Uhr
Goto Top
Du schreibst sehr viel, gibst aber kein Feedback auf meine Frage face-plain
Es muss nur 445 geöffnet sein, teste das doch mal mit dem Telnet-Befehl, siehe oben.
Telnet musst Du zunächst installieren: auf einer elevated powershell, führe aus

Install-WindowsFeature -name Telnet-Client
IceAge
IceAge 29.03.2020 aktualisiert um 16:14:25 Uhr
Goto Top
Ah stimmt. Wenn ich mit
 telnet 192.168.200.105 445 
prüfe, bleibt die CMD eine zeitlang ohne Ausgabe offen.

Laut nmap sind die Ports 135, 139 445, 3389 offen.
DerWoWusste
DerWoWusste 29.03.2020 um 22:11:55 Uhr
Goto Top
"bleibt die CMD eine zeitlang ohne Ausgabe offen" - du meinst, die Kommandozeile wird schwarz? Dann ist 445 offen und es muss gehen.
In den Fall ist irgendwas vergurkt. Hauptverdächtige sind immer Firewalls und Antivirensoftware.
Du kannst Dich davon selbst überzeugen, dass 445 alleien für qwinsta reicht, indem Du ein frisch installiertes System angehst.
IceAge
IceAge 30.03.2020 aktualisiert um 08:24:09 Uhr
Goto Top
Guten Morgen,

ok, vielen Dank für deine Hilfe. Ich werde weiter suchen und wenn ich den Fehler finde, hier auch posten.

Ja, die CMD bleibt eine zeitlang ohne Ausgabe offen. Habe zu Sicherheit mit nmap gegengeprüft.

Grüße I.