2012-03-05 16 views
18

मैं यह जांचने की कोशिश कर रहा था कि बंदरगाह खोला गया है या नहीं, इस प्रकार पावरहेल का उपयोग नहीं कर रहा है।नेटवर्क पोर्ट एक्सेस की जांच कैसे करें और उपयोगी संदेश प्रदर्शित करें?

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

यह विधि काम करती है, लेकिन आउटपुट उपयोगकर्ता के अनुकूल नहीं है। इसका मतलब है कि अगर कोई त्रुटि नहीं है तो इसका उपयोग हो सकता है। सफलता की जांच करने और "पोर्ट 443 परिचालन" जैसे कुछ संदेश प्रदर्शित करने का कोई तरीका है?

+2

यहां देखें http://poshcode.org/85 –

उत्तर

10

असल शे लेवी के जवाब लगभग सही है, लेकिन मैं एक अजीब मुद्दा मिल गया के रूप में मैं अपने टिप्पणी कॉलम में उल्लेख किया है। इसलिए मैंने कमांड को दो लाइनों में विभाजित किया और यह ठीक काम करता है।

$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. " 
    } 
10

आप जाँच लें कि कनेक्टेड संपत्ति $ सही पर सेट किया जाता है और एक दोस्ताना संदेश प्रदर्शित कर सकते हैं:

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

    if($t.Connected) 
    { 
     "Port 443 is operational" 
    } 
    else 
    { 
     "..." 
    } 
+0

बडी, मुझे उपरोक्त समाधान के साथ अजीब समस्या का सामना करना पड़ रहा है। उदाहरण के लिए। मैंने पहले पोर्ट 443 का उपयोग किया, यह असफल रहा और अन्य भाग स्ट्रिंग प्रदर्शित किया। तो मैंने पोर्ट नंबर दिया जिसकी पहुंच है (80)। यह भाग स्ट्रिंग अगर प्रदर्शित होता है। फिर मैंने पोर्ट नंबर को 443 में बदल दिया और यह भाग स्ट्रिंग अगर प्रदर्शित होता है। (इसे अन्य स्ट्रिंग प्रदर्शित करना चाहिए था) – Samselvaprabu

+0

मैं कोड – Samselvaprabu

25

मैं कई मायनों में Salselvaprabu के जवाब में सुधार:

  1. अब यह एक समारोह है - आप अपने powershell प्रोफ़ाइल में डाल दिया और किसी भी समय का उपयोग आप
  2. यह होस्ट नाम के रूप में या के रूप में मेजबान स्वीकार कर सकते हैं की जरूरत है सकते हैं आईपी ​​पते
  3. कोई और अधिक अपवाद अगर मेजबान या बंदरगाह unavaible - केवल टेक्स्ट

इसे इस तरह कॉल :

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 
} 
4

मैं mshutov से सुझाव को सुधारने की कोशिश की। मैंने आउटपुट को ऑब्जेक्ट के रूप में उपयोग करने का विकल्प जोड़ा।

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 
} 
27

यदि आप Windows 8/Windows Server 2012 या नए चला रहे हैं, तो आप Test-NetConnection आदेश का उपयोग कर सकते हैं।

पूर्व: Test-NetConnection -Port 53 -ComputerName LON-DC1

+3

कोड निष्पादित करने के लिए Powershell_Ise का उपयोग कर रहा हूं टेस्ट-नेटकनेक्शन केवल विंडोज 8.x और सर्वर 2012R2 और नए पर काम करता है। – dragon788

+0

'टेस्ट-नेटकनेक्शन' के रूप में नीचे वोट पीएस 5 तक उपलब्ध नहीं है। – Brettski

+0

@ ब्रेट्सकी आपकी टिप्पणी फ्लैट गलत है। पीएस 4 के साथ एक विंडोज सर्वर 2012 मशीन पर बस परीक्षण किया। हालांकि, यह [नेटटीसीपीआईपी मॉड्यूल] (https://docs.microsoft.com/en-us/powershell/module/nettcpip/?view=win10-ps) का हिस्सा है, जो विंडोज 7 और विंडोज़ पर उपलब्ध नहीं है सर्वर 2008 आर 2 और निचला। – jpmc26

0

जब बंद बंदरगाह स्कैनिंग यह लंबे समय के लिए निष्क्रिय हो जाता है। ऐसा लगता है कि fqdn को आईपी जैसे हल करना:

3

पावरशेल के नवीनतम संस्करणों के साथ, एक नया cmdlet, टेस्ट-नेटकनेक्शन है।

इस cmdlet,, आप की सुविधा देता है प्रभाव में पिंग एक बंदरगाह, इस तरह:

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

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन अगर आप इस पेज मारा (के रूप में मैंने किया था) इस जानकारी के लिए देख, यह जोड़ सहायक हो सकता है! ,

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

रिटर्न ठीक:

2

आप Powershell जहां टेस्ट NetConnection यहां उपलब्ध नहीं है, के पुराने संस्करणों का उपयोग कर रहे हैं, तो होस्ट नाम "my.hostname" और बंदरगाह "123" के लिए एक एक लाइनर है या एक त्रुटि संदेश।

0

mshutov & साल्सेल्वप्रबु द्वारा महान उत्तर।मुझे कुछ और अधिक मजबूत की जरूरत थी, और उसने सभी आईपी एड्रेस की जांच की जो केवल पहले की जांच करने के बजाय प्रदान की गई थीं।

मैं टेस्ट-कनेक्शन फ़ंक्शन की तुलना में पैरामीटर नामों और कार्यक्षमता में से कुछ को दोहराना चाहता था।

यह नया फ़ंक्शन आपको पुनः प्रयासों की संख्या और प्रत्येक प्रयास के बीच विलंब सेट करने की अनुमति देता है। का आनंद लें!

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 

} 
संबंधित मुद्दे