HttpListener – Prozess auf Port 80 herausfinden

Prozess-ID 4 belegt Port 80. Klassiker. Da sich dieser Prozess nicht beenden lässt, wird häufig dazu geraten, IIS komplett runterzuwerfen.

Ist allerdings suboptimal, wenn man diesen bzw. den HttpListener für andere Software benötigt (looking at you, Veeam).

Vorher: Bindungen checken

Erster Blick wäre natürlich in der IIS-Verwaltungskonsole, ob eine Webseite auf Port 80 bindet. Dazu im IIS-Manager Rechtsklick auf alle Seiten > Bindungen bearbeiten

Steht da irgendwo Port 80? Dann Bindungen Bearbeiten, Port ändern, Ruhe.

Händisch

Manchmal ist es allerdings auch ein anderes Programm, welches sich den Port 80 über den HttpListener snitcht. Gott sei Dank können wir den HttpListener fragen, wer. CMD als Admin:

netsh http show servicestate view=requestq verbose=yes

Der Block, den wir suchen, sieht z.B. wie folgt aus:

Anforderungswarteschlangenname: Die Anforderungswarteschlange ist nicht benannt.
    Version: 2.0
    Status: Active
    Ausführlichkeitsgrad der Anforderungswarteschlange 503: Einfach
    Maximale Anzahl von Anforderungen: 1000
    Anzahl von aktiven verbundenen Prozessen: 1
    Prozess-IDs:
        <strong>2412</strong>
    URL-Gruppen:
    URL-Gruppen-ID: FE00000640000001
        Status: Active
        Anforderungswarteschlangenname: Die Anforderungswarteschlange ist nicht benannt.
        Eigenschaften:
            Max. Bandbreite: vererbt
            Max. Verbindungen: vererbt
            Zeitlimits:
                Entitätskörper-Zeitlimit (Sek.): 120
                Ausgleichentitätskörper-Zeitlimit (Sek.): 0
                Anforderungswarteschlangen-Zeitlimit (Sek.): 0
                Zeitlimit für Leerlaufverbindung (Sek.): 0
                Zeitlimit für Warten auf Header (Sek.): 0
                Minimale Übertragungsrate (Bytes/Sek.): 0
            Authentifizierungskonfiguration:
                Aktivierte Authentifikationsschemas:
                    Aushandeln
            Anzahl von registrierten URLs: 1
            Registrierte URLs:
                <span class="color: red;"><strong>HTTP://+:80/116B50EB-ECE2-41AC-8429-9F9E963361B7/</strong></span>
        Serversitzungs-ID: FF00000620000001
            Version: 2.0
            Status: Active
            Eigenschaften:
                Max. Bandbreite: 4294967295
                Zeitlimits:
                    Entitätskörper-Zeitlimit (Sek.): 120
                    Ausgleichentitätskörper-Zeitlimit (Sek.): 120
                    Anforderungswarteschlangen-Zeitlimit (Sek.): 120
                    Zeitlimit für Leerlaufverbindung (Sek.): 120
                    Zeitlimit für Warten auf Header (Sek.): 120
                    Minimale Übertragungsrate (Bytes/Sek.): 150Code-Sprache: HTML, XML (xml)

Die zwei relevanten Sachen hier: die PID und die registrierte URL. Die PID können wir z.B. im Taskmanager raussuchen, um den Dienst herauszufinden, der den Port 80 belegt und diesen abschießen – oder permanent deaktivieren.

Den Namen des Prozesses bekommen wir übrigens auch mit folgendem Befehl:

wmic process where processid="2412" get processid,commandlineCode-Sprache: JavaScript (javascript)

Sollte der Übeltäter svchost.exe sein, bekommen wir über den Befehl ebenfalls die Parameter, mit denen er gestartet wurde – und können so den Dienst dahinter ermitteln.

Per PowerShell

Das ist kein Original-Code von mir. Der Code wurde von FSCKur auf StackOverflow gepostet – siehe hier

Folgender PowerShell-Code kann als Administrator ausgeführt werden, um den Prozess programmiertechnisch zu ermitteln und abzuschießen:

$Uri = "http://127.0.0.1:8989"    # for example


# Shows processes that have registered URLs with HTTP.sys
$QueueText = netsh http show servicestate view=requestq verbose=yes | Out-String

# Break into text chunks; discard the header
$Queues    = $QueueText -split '(?<=\n)(?=Request queue name)' | Select-Object -Skip 1

# Find the chunk for the request queue listening on your URI
$Queue     = @($Queues) -match [regex]::Escape($Uri -replace '/$')


if ($Queue.Count -eq 1)
{
    # Will be null if could not pick out exactly one PID
    $ProcessId = [string]$Queue -replace '(?s).*Process IDs:\s+' -replace '(?s)\s.*' -as [int]

    if ($ProcessId)
    {
        Write-Verbose "Identified process $ProcessId as the HTTP listener. Killing..."
        Stop-Process -Id $ProcessId -Confirm
    }
}Code-Sprache: PHP (php)

Der Code ist allerdings mit Vorsicht zu genießen, denn nach einem Neustart wird vermutlich der entsprechende Dienst wieder laufen. Und je nachdem, was das für ein Dienst ist, kann er auch Probleme verursachen, wenn er einfach beendet wird, statt dessen Port zu ändern.