web-dev-qa-db-de.com

Wie kann ich den Zugriff auf den Netzwerkport überprüfen und nützliche Nachrichten anzeigen?

Ich habe versucht zu prüfen, ob der Port geöffnet ist oder nicht, wie folgt.

(new-object Net.Sockets.TcpClient).Connect("10.45.23.109", 443)

Diese Methode funktioniert, aber die Ausgabe ist nicht benutzerfreundlich. Das bedeutet, wenn keine Fehler vorliegen, hat es Zugriff. Gibt es eine Möglichkeit, den Erfolg zu überprüfen und eine Meldung wie "Port 443 ist in Betrieb" anzuzeigen?

23
Samselvaprabu

Eigentlich ist Shay Levys Antwort fast richtig, aber ich habe ein seltsames Problem, wie ich in seiner Kommentarsäule erwähnte. Ich teile den Befehl in zwei Zeilen auf und es funktioniert gut.

$Ipaddress= Read-Host "Enter the IP address:"
$Port= Read-Host "Enter the port number to access:"

$t = New-Object Net.Sockets.TcpClient
$t.Connect($Ipaddress,$Port)
    if($t.Connected)
    {
        "Port $Port is operational"
    }
    else
    {
        "Port $Port is closed, You may need to contact your IT team to open it. "
    }
12
Samselvaprabu

Wenn Sie Windows 8/Windows Server 2012 oder neuer ausführen, können Sie den Befehl Test-NetConnection in PowerShell verwenden.

ZB: Test-NetConnection -Port 53 -ComputerName LON-DC1

37
SimonOzturk

Ich habe Salselvaprabus Antwort auf verschiedene Weise verbessert:

  1. Es ist jetzt eine Funktion - Sie können Ihr Powershell-Profil einfügen und jederzeit nutzen
  2. Es kann Host als Hostnamen oder als IP-Adresse akzeptieren
  3. Keine Ausnahmen mehr, wenn Host oder Port nicht erreichbar sind - nur Text

Nenne es so: 

Test-Port example.com 999
Test-Port 192.168.0.1 80

function Test-Port($hostname, $port)
{
    # This works no matter in which form we get $Host - hostname or ip address
    try {
        $ip = [System.Net.Dns]::GetHostAddresses($hostname) | 
            select-object IPAddressToString -expandproperty  IPAddressToString
        if($ip.GetType().Name -eq "Object[]")
        {
            #If we have several ip's for that address, let's take first one
            $ip = $ip[0]
        }
    } catch {
        Write-Host "Possibly $hostname is wrong hostname or IP"
        return
    }
    $t = New-Object Net.Sockets.TcpClient
    # We use Try\Catch to remove exception info from console if we can't connect
    try
    {
        $t.Connect($ip,$port)
    } catch {}

    if($t.Connected)
    {
        $t.Close()
        $msg = "Port $port is operational"
    }
    else
    {
        $msg = "Port $port on $ip is closed, "
        $msg += "You may need to contact your IT team to open it. "                                 
    }
    Write-Host $msg
}
35
mshutov

Sie können überprüfen, ob die Eigenschaft Connected auf $ true festgelegt ist, und eine freundliche Nachricht anzeigen:

    $t = New-Object Net.Sockets.TcpClient "10.45.23.109", 443 

    if($t.Connected)
    {
        "Port 443 is operational"
    }
    else
    {
        "..."
    }
11
Shay Levy

Mit den neuesten Versionen von PowerShell gibt es das neue Cmdlet Test-NetConnection.

Mit diesem Cmdlet können Sie einen Port wie folgt pingen:

Test-NetConnection -ComputerName <remote server> -Port nnnn

Ich weiß, dass dies eine alte Frage ist, aber wenn Sie diese Seite besuchen (wie ich), um nach diesen Informationen zu suchen, kann dieser Zusatz hilfreich sein!

6
Thomas Lee

Ich habe versucht, den Vorschlag von mshutov zu verbessern ..__ Ich habe die Option hinzugefügt, die Ausgabe als Objekt zu verwenden.

 function Test-Port($hostname, $port)
    {
    # This works no matter in which form we get $Host - hostname or ip address
    try {
        $ip = [System.Net.Dns]::GetHostAddresses($hostname) | 
            select-object IPAddressToString -expandproperty  IPAddressToString
        if($ip.GetType().Name -eq "Object[]")
        {
            #If we have several ip's for that address, let's take first one
            $ip = $ip[0]
        }
    } catch {
        Write-Host "Possibly $hostname is wrong hostname or IP"
        return
    }
    $t = New-Object Net.Sockets.TcpClient
    # We use Try\Catch to remove exception info from console if we can't connect
    try
    {
        $t.Connect($ip,$port)
    } catch {}

    if($t.Connected)
    {
        $t.Close()
        $object = [pscustomobject] @{
                        Hostname = $hostname
                        IP = $IP
                        TCPPort = $port
                        GetResponse = $True }
        Write-Output $object
    }
    else
    {
        $object = [pscustomobject] @{
                        Computername = $IP
                        TCPPort = $port
                        GetResponse = $False }
        Write-Output $object

    }
    Write-Host $msg
}
4
Hilbert

Wenn Sie ältere Versionen von PowerShell verwenden, für die Test-NetConnection nicht verfügbar ist, finden Sie hier einen Einzeiler für den Hostnamen "my.hostname" und den Port "123":

$t = New-Object System.Net.Sockets.TcpClient 'my.hostname', 123; if($t.Connected) {"OK"}

Gibt OK oder eine Fehlermeldung zurück.

3
David I.

Tolle Antwort von Mshutov & Salselvaprabu. Ich brauchte etwas robusteres, und das überprüfte alle IP-Adressen, die bereitgestellt wurden, anstatt nur die erste zu überprüfen.

Ich wollte auch einige Parameternamen und Funktionen als die Test-Connection-Funktion replizieren.

Mit dieser neuen Funktion können Sie eine Anzahl für die Anzahl der Wiederholungen und die Verzögerung zwischen den einzelnen Versuchen einstellen. Genießen!

function Test-Port {

    [CmdletBinding()]
    Param (
        [string] $ComputerName,
        [int] $Port,
        [int] $Delay = 1,
        [int] $Count = 3
    )

    function Test-TcpClient ($IPAddress, $Port) {

        $TcpClient = New-Object Net.Sockets.TcpClient
        Try { $TcpClient.Connect($IPAddress, $Port) } Catch {}

        If ($TcpClient.Connected) { $TcpClient.Close(); Return $True }
        Return $False

    }

    function Invoke-Test ($ComputerName, $Port) {

        Try   { [array]$IPAddress = [System.Net.Dns]::GetHostAddresses($ComputerName) | Select-Object -Expand IPAddressToString } 
        Catch { Return $False }

        [array]$Results = $IPAddress | % { Test-TcpClient -IPAddress $_ -Port $Port }
        If ($Results -contains $True) { Return $True } Else { Return $False }

    }

    for ($i = 1; ((Invoke-Test -ComputerName $ComputerName -Port $Port) -ne $True); $i++)
    {
        if ($i -ge $Count) {
            Write-Warning "Timed out while waiting for port $Port to be open on $ComputerName!"
            Return $false
        }

        Write-Warning "Port $Port not open, retrying..."
        Sleep $Delay
    }

    Return $true

}
0
Marc Kellerman

dies wurde auf einen Liner verkürzt und setzt die Variable "$ port389Open" auf "True" oder "False". Sie kann schnell und einfach für eine Liste von Ports repliziert werden

try{$socket = New-Object Net.Sockets.TcpClient($ipAddress,389);if($socket -eq $null){$Port389Open = $false}else{Port389Open = $true;$socket.close()}}catch{Port389Open = $false}

Wenn Sie nicht wirklich verrückt werden wollen, können Sie das gesamte Array zurückgeben. 

Function StdPorts($ip){
    $rst = "" |  select IP,Port547Open,Port135Open,Port3389Open,Port389Open,Port53Open
    $rst.IP = $Ip
    try{$socket = New-Object Net.Sockets.TcpClient($ip,389);if($socket -eq $null){$rst.Port389Open = $false}else{$rst.Port389Open = $true;$socket.close();$ipscore++}}catch{$rst.Port389Open = $false}
    try{$socket = New-Object Net.Sockets.TcpClient($ip,53);if($socket -eq $null){$rst.Port53Open = $false}else{$rst.Port53Open = $true;$socket.close();$ipscore++}}catch{$rst.Port53Open = $false}
    try{$socket = New-Object Net.Sockets.TcpClient($ip,3389);if($socket -eq $null){$rst.Port3389Open = $false}else{$rst.Port3389Open = $true;$socket.close();$ipscore++}}catch{$rst.Port3389Open = $false}
    try{$socket = New-Object Net.Sockets.TcpClient($ip,547);if($socket -eq $null){$rst.Port547Open = $false}else{$rst.Port547Open = $true;$socket.close();$ipscore++}}catch{$rst.Port547Open = $false}
    try{$socket = New-Object Net.Sockets.TcpClient($ip,135);if($socket -eq $null){$rst.Port135Open = $false}else{$rst.Port135Open = $true;$socket.close();$SkipWMI = $False;$ipscore++}}catch{$rst.Port135Open = $false}
    Return $rst
}
0
jdelpheki

Beim Scannen eines geschlossenen Ports reagiert es längere Zeit nicht mehr. Es scheint schneller zu sein, wenn Sie fqdn in ip wie folgt auflösen:

0
uzjsme