Jak sprawdzić dostęp do portu sieciowego i wyświetlić przydatną wiadomość?

Próbowałem sprawdzić, czy port jest otwarty, czy nie używając powershell jak poniżej.

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

Ta metoda działa, ale wyjście nie jest przyjazne dla użytkownika. Oznacza to, że jeśli nie ma błędów, to ma dostęp. Czy jest jakiś sposób na sprawdzenie sukcesu i wyświetlenie jakiegoś komunikatu typu "Port 443 działa"?

Author: essential, 2012-03-05

10 answers

Jeśli używasz systemu Windows 8 / Windows Server 2012 lub nowszego, możesz użyć polecenia Test-NetConnection w PowerShell.

Ex:

Test-NetConnection -Port 53 -ComputerName LON-DC1
 64
Author: SimonOzturk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-26 09:13:09

Poprawiłem odpowiedź Salselvaprabu na kilka sposobów:

  1. jest to teraz funkcja - Możesz umieścić swój profil powershell i używać go w dowolnym momencie
  2. może przyjmować host jako nazwę hosta lub jako adres ip
  3. koniec z wyjątkami, jeśli host lub port są niedostępne-po prostu tekst

Nazwij to tak:

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
}
 44
Author: mshutov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 05:38:40

Właściwie odpowiedź Shay 'a levy' ego jest prawie poprawna, ale mam dziwny problem, o którym wspomniałem w jego komentarzu. Więc podzieliłem polecenie na dwie linie i działa dobrze.

$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. "
    }
 16
Author: Samselvaprabu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 07:06:40

Możesz sprawdzić, czy podłączona właściwość jest ustawiona na $true i wyświetlić przyjazną wiadomość:

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

    if($t.Connected)
    {
        "Port 443 is operational"
    }
    else
    {
        "..."
    }
 13
Author: Shay Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 13:03:01

Z najnowszymi wersjami PowerShell, pojawił się nowy cmdlet, Test-NetConnection.

Ten cmdlet pozwala, w efekcie, ping portu, jak to:

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

Wiem, że to stare pytanie, ale jeśli trafisz na tę stronę (tak jak ja) szukając tych informacji, ten dodatek może być pomocny!

 8
Author: Thomas Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 19:41:17

Starałem się poprawić sugestię mshutova. Dodałem opcję użycia wyjścia jako obiektu.

 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
Author: Hilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-17 16:10:04

Jeśli używasz starszych wersji Powershell, w których Test-NetConnection nie jest dostępny, oto jednolinijkowa Nazwa hosta " my.Nazwa hosta " i port "123":

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

Zwraca OK lub komunikat o błędzie.

 4
Author: David I.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-19 21:54:14

[1]} świetna odpowiedź mshutov & Salselvaprabu. Potrzebowałem czegoś trochę bardziej wytrzymałego, a to sprawdzało wszystkie Ipaddresy, które zostały dostarczone, zamiast sprawdzać tylko pierwszy.

Chciałem również odtworzyć niektóre nazwy parametrów i funkcjonalności niż funkcja Test-Connection.

Ta nowa funkcja pozwala ustawić liczbę powtórzeń i opóźnienie między każdą próbą. Smacznego!

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
Author: Marc Kellerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 13:10:02

Booted to down to a one liner ustawia zmienną "$port389Open " na True lub false - jego szybkie i łatwe do replikacji dla listy portów

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

Jeśli chcesz naprawdę zwariować, możesz zwrócić całą tablicę -

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
Author: jdelpheki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-01 21:49:12

Podczas skanowania zamkniętego portu przestaje reagować przez długi czas. Wydaje się, że jest szybszy przy rozwiązywaniu fqdn na ip jak:

[System.Net.Dns]::GetHostAddresses("www.msn.com").IPAddressToString
 -1
Author: uzjsme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-18 15:14:25