Как проверить доступ к сетевому порту и отобразить полезное сообщение?

Я пытался проверить, открыт порт или нет используя powershell, как показано ниже.

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

Этот метод работает, но результат не удобен для пользователя. Это означает, что если ошибок нет, то он имеет доступ. Есть ли способ проверить успешность выполнения и отобразить сообщение вроде "Порт 443 работает"?

28
задан Samselvaprabu 5 March 2012 в 11:55
поделиться

3 ответа

Я улучшил ответ Сальсельвапрабу несколькими способами:

  1. Теперь это функция - вы можете добавить свой профиль powershell и использовать в любое время, когда вам нужно
  2. Он может принимать хост в качестве имени хоста или как IP-адрес
  3. Больше нет исключений, если хост или порт недоступны - просто текст

Назовите это так:

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
}
42
ответ дан 28 November 2019 в 02:14
поделиться

Вы можете проверить, установлено ли для свойства Connected значение $ true, и отобразить дружеское сообщение:

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

    if($t.Connected)
    {
        "Port 443 is operational"
    }
    else
    {
        "..."
    }
13
ответ дан 28 November 2019 в 02:14
поделиться

Я пытался улучшить предложение от мшутов. Я добавил возможность использовать вывод как объект.

 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
ответ дан 28 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: