none
Test-Port не работает на русской версии Windows ?

    Вопрос

  • При попытке проверить открыт ли UDP порт 1433 (SQL Browser) c русской Windows 7 Prof с помощью Powershell Test-Port

    Test-Port -comp 192.168.1.1 -port 1434 -udp -UDPtimeout 1000
    Test-Port -comp 192.168.1.2 -port 1434 -udp -UDPtimeout 1000

    в любом случае (открыт/закрыт) получаю :

    Exception calling "Receive" with "1" argument(s): "Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"

    При запуске на английской версии получаю разные ошибки :

    Exception calling "Receive" with "1" argument(s): "An existing connection was forcibly closed by the remote host"

    Exception calling "Receive" with "1" argument(s): "A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed be
    cause connected host has failed to respond"

    т.е. system.Net.Sockets.Udpclient работает по разному на RUS / ENG ?


    13 июля 2017 г. 19:43

Ответы

  • Прекрасно оно могло работать, только в случае TCP, у нас же UDP. И если хост не вернул ICMP port unreachable , то без дополнительных проб нельзя сказать, что порт открыт/закрыт.

    https://en.wikipedia.org/wiki/Port_scanner#UDP_scanning

    UDP scanning

    UDP scanning is also possible, although there are technical challengesUDP is a connectionless protocol so there is no equivalent to a TCP SYN packet. However, if a UDP packet is sent to a port that is not open, the system will respond with an ICMP port unreachable message. Most UDP port scanners use this scanning method, and use the absence of a response to infer that a port is open. However, if a port is blocked by a firewall, this method will falsely report that the port is open. If the port unreachable message is blocked, all ports will appear open. This method is also affected by ICMP rate limiting.

    nmap -sU -p 5555 8.8.8.8
    
    Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
    
    PORT     STATE         SERVICE
    5555/udp open|filtered rplay
    

    Если требуется тестировать только порт 1434, то лучше использовать probe = 0x02,0x00,0x00 для определения сервиса. - http://sqlserverio.com/2013/02/27/finding-sql-server-installs-using-powershell/

    function QuerySQLListener{
        Param(
            [Parameter(
            Mandatory = $True,
            ValueFromPipeline = $True)]
            [string]$Computer
        )
        Begin {
            $ErrorActionPreference = "SilentlyContinue";
            $Port = 1434
            $ConnectionTimeout = 1000
            $Responses  = @();
        }
        Process {
            $UDPClient = new-Object system.Net.Sockets.Udpclient
            $UDPClient.client.ReceiveTimeout = $ConnectionTimeout
            $IPAddress = [System.Net.Dns]::GetHostEntry($Computer).AddressList[0].IPAddressToString
            $UDPClient.Connect($IPAddress,$Port)
            $ToASCII = new-object system.text.asciiencoding
            $UDPPacket = 0x02,0x00,0x00
            Try {
                $UDPEndpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
                $UDPClient.Client.Blocking = $True
                [void]$UDPClient.Send($UDPPacket,$UDPPacket.length)
                $BytesRecived = $UDPClient.Receive([ref]$UDPEndpoint)
                [string]$Response = $ToASCII.GetString($BytesRecived)
                $res = ""
                If ($Response) {
                    $Response = $Response.Substring(3,$Response.Length-3).Replace(";;","~")
                    $Response.Split("") | ForEach {
                    $Responses += $_
                }
                $socket = $null;
                $UDPClient.close()
            }
            }
            Catch {
                $Error[0].ToString()
                $UDPClient.Close()
            }
        }
        End {
            return ,$Responses
        }
    }
    
    QuerySQLListener sqlsrv

    Примерный вывод:

    ServerName;sqlsvr;InstanceName;Test;IsClustered;No;Version;10.50.6000.34;tcp;1433.......


    • Изменено KazunEditor 15 июля 2017 г. 14:49
    • Помечено в качестве ответа KazunEditor 19 июля 2017 г. 7:20
    15 июля 2017 г. 14:44
    Отвечающий

Все ответы

  • Идентично:

    RUS:

    PS > Test-Port -comp localhost -port 1434 -udp -UDPtimeout 1000
    
    PS > $error
    Исключение при вызове "Receive" с "1" аргументами: "Удаленный хост принудительно разорвал существующее подключение"
    строка:199 знак:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException
    
    PS > Test-Port -comp ya.ru -port 1434 -udp -UDPtimeout 1000
    
    PS > $error
    Исключение при вызове "Receive" с "1" аргументами: "Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужны
    й отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"
    строка:199 знак:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException
    
    Исключение при вызове "Receive" с "1" аргументами: "Удаленный хост принудительно разорвал существующее подключение"
    строка:199 знак:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException

    ENG:

    PS C:\Windows\system32> Test-Port -comp localhost -port 1434 -udp -UDPtimeout 1000
    
    PS > $error
    Exception calling "Receive" with "1" argument(s): "An existing connection was forcibly closed by the remote host"
    At line:199 char:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException
    
    PS > Test-Port -comp ya.ru -port 1434 -udp -UDPtimeout 1000
    
    PS > $error
    Exception calling "Receive" with "1" argument(s): "A connection attempt failed because the connected party did not prop
    erly respond after a period of time, or established connection failed because connected host has failed to respond"
    At line:199 char:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException
    
    Exception calling "Receive" with "1" argument(s): "An existing connection was forcibly closed by the remote host"
    At line:199 char:25
    + ...              $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    +                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : SocketException

    13 июля 2017 г. 21:03
    Отвечающий
  • Я добавил в скрипт Test-Port

    If ($Error[0].ToString() -match "\bRespond after a period of time\b" `
    -OR $Error[0].ToString() -match "\bза требуемое время не получен нужный отклик\b") { 
    
    } ElseIf ($Error[0].ToString() -match "forcibly closed by the remote host" `
    -OR $Error[0].ToString() -match "принудительно разорвал существующее подключение") { 
    
    

    но код почему-то у меня не работает.

    Постоянно получаю

    Exception calling "Receive" with "1" argument(s): "Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"

    или

    Exception calling "Receive" with "1" argument(s): "A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond"

    и НЕ получаю

    Exception calling "Receive" with "1" argument(s): "Удаленный хост принудительно разорвал существующее подключение"

    и

    Exception calling "Receive" with "1" argument(s): "An existing connection was forcibly closed by the remote host"

    Хотя раньше прекрасно всё работало.

    Службу SQL Browser стартую/останавливаю. Проверяю порт открыт/закрыт ( Get-NetworkStatistics )

    Всё одно - получаю порт открыт.

    Работает только если запустить локально на сервере с SQL сервером.

    Гипотезы: WMF обновлялся, vmware на хосте, ...

    14 июля 2017 г. 20:40
  • Прекрасно оно могло работать, только в случае TCP, у нас же UDP. И если хост не вернул ICMP port unreachable , то без дополнительных проб нельзя сказать, что порт открыт/закрыт.

    https://en.wikipedia.org/wiki/Port_scanner#UDP_scanning

    UDP scanning

    UDP scanning is also possible, although there are technical challengesUDP is a connectionless protocol so there is no equivalent to a TCP SYN packet. However, if a UDP packet is sent to a port that is not open, the system will respond with an ICMP port unreachable message. Most UDP port scanners use this scanning method, and use the absence of a response to infer that a port is open. However, if a port is blocked by a firewall, this method will falsely report that the port is open. If the port unreachable message is blocked, all ports will appear open. This method is also affected by ICMP rate limiting.

    nmap -sU -p 5555 8.8.8.8
    
    Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
    
    PORT     STATE         SERVICE
    5555/udp open|filtered rplay
    

    Если требуется тестировать только порт 1434, то лучше использовать probe = 0x02,0x00,0x00 для определения сервиса. - http://sqlserverio.com/2013/02/27/finding-sql-server-installs-using-powershell/

    function QuerySQLListener{
        Param(
            [Parameter(
            Mandatory = $True,
            ValueFromPipeline = $True)]
            [string]$Computer
        )
        Begin {
            $ErrorActionPreference = "SilentlyContinue";
            $Port = 1434
            $ConnectionTimeout = 1000
            $Responses  = @();
        }
        Process {
            $UDPClient = new-Object system.Net.Sockets.Udpclient
            $UDPClient.client.ReceiveTimeout = $ConnectionTimeout
            $IPAddress = [System.Net.Dns]::GetHostEntry($Computer).AddressList[0].IPAddressToString
            $UDPClient.Connect($IPAddress,$Port)
            $ToASCII = new-object system.text.asciiencoding
            $UDPPacket = 0x02,0x00,0x00
            Try {
                $UDPEndpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
                $UDPClient.Client.Blocking = $True
                [void]$UDPClient.Send($UDPPacket,$UDPPacket.length)
                $BytesRecived = $UDPClient.Receive([ref]$UDPEndpoint)
                [string]$Response = $ToASCII.GetString($BytesRecived)
                $res = ""
                If ($Response) {
                    $Response = $Response.Substring(3,$Response.Length-3).Replace(";;","~")
                    $Response.Split("") | ForEach {
                    $Responses += $_
                }
                $socket = $null;
                $UDPClient.close()
            }
            }
            Catch {
                $Error[0].ToString()
                $UDPClient.Close()
            }
        }
        End {
            return ,$Responses
        }
    }
    
    QuerySQLListener sqlsrv

    Примерный вывод:

    ServerName;sqlsvr;InstanceName;Test;IsClustered;No;Version;10.50.6000.34;tcp;1433.......


    • Изменено KazunEditor 15 июля 2017 г. 14:49
    • Помечено в качестве ответа KazunEditor 19 июля 2017 г. 7:20
    15 июля 2017 г. 14:44
    Отвечающий
  • Спасибо,

    всё прекрасно заработало.

    P.S.

    ICMP, наверное, подкрутили в Windows из-за безопасности.

    20 июля 2017 г. 19:39