2011-05-05 53 views
4

我有一些網站和服務安裝在機器上。他們被分配端口號。現在,每次我想要安裝新的服務器時,我必須檢查端口並查看現有的端口號是否不再使用。腳本查找服務和網站收聽端口

我想編寫一個我瞭解,是的它可以編寫一個腳本,將有助於獲得通過服務和網站使用的端口號......但get-process例如,有沒有辦法獲得港口。

有人可以幫助我,這樣可以找到所選進程的統計信息嗎? 還是有更好的方法來處理這個問題?

+0

+1我有興趣 – 2011-05-05 07:22:20

+0

我測試了我在答案中提到的函數並報告了結果。這對我來說可以。乾杯 – 2011-05-06 07:32:27

回答

3

可能這是一個愚蠢的答案,但爲什麼不:

 
$procstats = netstat -o 

是的,我知道,真的不容易管理的字符串數組。看看here


最具體的方式是使用Win32 GetExtendedTcpTable它允許你與PID一起檢索TCP端點列表認真的解決方法。 this後的解決方案提供了一個實現win32函數的c#netstat函數的powershell綁定。它看起來不錯。

當您有端點連接的端口/ PID /地址後,您可以利用System.Net.NetworkInformation類獲取有關連接的信息和統計信息。


get-netstat

它的工作原理就像一個魅力一些測試之後。例如,下面的一行獲取所有TCP連接(遠程/本地)與PID沿着端口63775建立:

 
. .\get-nestat.ps1 
$netstat = get-netstat | ? {($_.localport -eq 63775 -or $_.remoteport -eq 63775) -and $_.protocol -eq TCP -and $_.state -eq 'ESTABLISHED'} | select PID, PIDName, State, LocalIP, RemoteIP 

您現在可以從my gists得到函數文件。

+0

將所有信息附加到單個字符串中的PowerShell函數?我的眼睛在流血...... – JasonMArcher 2011-05-05 16:04:01

+0

是的,netstat解決方案有點粗魯:)用更嚴謹的解決方案編輯答案。 – 2011-05-06 00:26:00

1

你有一個很好的解決方案here也工作於Netstat

netstat -a -n -o 
0

雖然我知道,PowerShell是完全能夠運行netstat並捕獲輸出的,它仍然是文本分析,而不是面向對象的PowerShell是不會要。所以,我提交了我的PowerShell複製netstat -aon並增加了服務信息。它沒有做的是確定具體的網站監聽端口由原始問題指定。對我來說,這將更像是一個IIS腳本,而不是一般的網絡腳本。再次,非常感謝pinvoke.net(我也發佈了這個代碼)。

[email protected]" 
using System; 
using System.Runtime.InteropServices; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 

// https://msdn2.microsoft.com/en-us/library/aa366073.aspx 
namespace IPHelper { 

    // https://msdn2.microsoft.com/en-us/library/aa366913.aspx 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MIB_TCPROW_OWNER_PID { 
     public uint state; 
     public uint localAddr; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] localPort; 
     public uint remoteAddr; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] remotePort; 
     public uint owningPid; 
    } 

    // https://msdn2.microsoft.com/en-us/library/aa366921.aspx 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MIB_TCPTABLE_OWNER_PID { 
     public uint dwNumEntries; 
     [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] 
     public MIB_TCPROW_OWNER_PID[] table; 
    } 

    // https://msdn.microsoft.com/en-us/library/aa366896 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MIB_TCP6ROW_OWNER_PID { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] 
     public byte[] localAddr; 
     public uint localScopeId; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] localPort; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] 
     public byte[] remoteAddr; 
     public uint remoteScopeId; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] remotePort; 
     public uint state; 
     public uint owningPid; 
    } 

    // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366905 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MIB_TCP6TABLE_OWNER_PID { 
     public uint dwNumEntries; 
     [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] 
     public MIB_TCP6ROW_OWNER_PID[] table; 
    } 

    // https://msdn2.microsoft.com/en-us/library/aa366386.aspx 
    public enum TCP_TABLE_CLASS { 
     TCP_TABLE_BASIC_LISTENER, 
     TCP_TABLE_BASIC_CONNECTIONS, 
     TCP_TABLE_BASIC_ALL, 
     TCP_TABLE_OWNER_PID_LISTENER, 
     TCP_TABLE_OWNER_PID_CONNECTIONS, 
     TCP_TABLE_OWNER_PID_ALL, 
     TCP_TABLE_OWNER_MODULE_LISTENER, 
     TCP_TABLE_OWNER_MODULE_CONNECTIONS, 
     TCP_TABLE_OWNER_MODULE_ALL 
    } 

    // https://msdn.microsoft.com/en-us/library/aa366896.aspx 
    public enum MIB_TCP_STATE { 
     MIB_TCP_STATE_CLOSED, 
     MIB_TCP_STATE_LISTEN, 
     MIB_TCP_STATE_SYN_SENT, 
     MIB_TCP_STATE_SYN_RCVD, 
     MIB_TCP_STATE_ESTAB, 
     MIB_TCP_STATE_FIN_WAIT1, 
     MIB_TCP_STATE_FIN_WAIT2, 
     MIB_TCP_STATE_CLOSE_WAIT, 
     MIB_TCP_STATE_CLOSING, 
     MIB_TCP_STATE_LAST_ACK, 
     MIB_TCP_STATE_TIME_WAIT, 
     MIB_TCP_STATE_DELETE_TCB 
    } 

    public static class IPHelperAPI { 
     [DllImport("iphlpapi.dll", SetLastError = true)] 
     internal static extern uint GetExtendedTcpTable(
      IntPtr tcpTable, 
      ref int tcpTableLength, 
      bool sort, 
      int ipVersion, 
      TCP_TABLE_CLASS tcpTableType, 
      int reserved=0); 
    } 

    public class IPHelperWrapper : IDisposable { 

     public const int AF_INET = 2; // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork 
     public const int AF_INET6 = 23; // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6 

     // Creates a new wrapper for the local machine 
     public IPHelperWrapper() { } 

     // Disposes of this wrapper 
     public void Dispose() { GC.SuppressFinalize(this); } 

     public List<MIB_TCPROW_OWNER_PID> GetAllTCPv4Connections() { 
      return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET); 
     } 

     public List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections() { 
      return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6); 
     } 

     public List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion) { //IPR = Row Type, IPT = Table Type 

      IPR[] tableRows; 
      int buffSize = 0; 
      var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries"); 

      // how much memory do we need? 
      uint ret = IPHelperAPI.GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL); 
      IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize); 

      try { 
       ret = IPHelperAPI.GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL); 
       if (ret != 0) return new List<IPR>(); 

       // get the number of entries in the table 
       IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT)); 
       int rowStructSize = Marshal.SizeOf(typeof(IPR)); 
       uint numEntries = (uint)dwNumEntriesField.GetValue(table); 

       // buffer we will be returning 
       tableRows = new IPR[numEntries]; 

       IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4); 
       for (int i = 0; i < numEntries; i++) { 
        IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR)); 
        tableRows[i] = tcpRow; 
        rowPtr = (IntPtr)((long)rowPtr + rowStructSize); // next entry 
       } 
      } 
      finally { 
       // Free the Memory 
       Marshal.FreeHGlobal(tcpTablePtr); 
      } 
      return tableRows != null ? tableRows.ToList() : new List<IPR>(); 
     } 

     // Occurs on destruction of the Wrapper 
     ~IPHelperWrapper() { Dispose(); } 

    } // wrapper class 
} // namespace 
"@ 
Add-Type -TypeDefinition $TypeDefinition -PassThru | Out-Null 

function NetStat { 

    $x=New-Object IPHelper.IPHelperWrapper 
    $y=$x.GetAllTCPv4Connections() 
    $services=Get-WmiObject -Namespace "root\cimv2" -Class "Win32_Service" 
    [email protected]("UNKNOWN","CLOSED","LISTEN","SYN-SENT","SYN-RECEIVED","ESTABLISHED","FIN-WAIT-1","FIN-WAIT-2","CLOSE-WAIT","CLOSING","LAST-ACK","TIME-WAIT","DELETE-TCB") 
    [email protected]() 
    for ($i=0; $i -lt $y.Count; $i++) { 
    $objOutput=New-Object -TypeName PSObject 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "LocalAddress" -Value ([System.Net.IPAddress]::new($y[$i].localAddr).IPAddressToString) 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "RemoteAddress" -Value ([System.Net.IPAddress]::new($y[$i].remoteAddr).IPAddressToString) 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "LocalPort" -Value ($y[$i].localPort[1]+($y[$i].localPort[0]*0x100)+($y[$i].localPort[3]*0x1000)+($y[$i].localPort[2]*0x10000)) 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "RemotePort" -Value ($y[$i].remotePort[1]+($y[$i].remotePort[0]*0x100)+($y[$i].remotePort[3]*0x1000)+($y[$i].remotePort[2]*0x10000)) 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "PID" -Value $y[$i].owningPid 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ProcessName" -Value ((Get-Process -Id $y[$i].owningPid).ProcessName) 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "StateValue" -Value $y[$i].state 
    Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "State" -Value $StateList[$y[$i].state] 
    $boolNoService=$true 
    for ($j=0; $j -lt $services.Count; $j++) { 
     if ($services[$j].ProcessId -eq $y[$i].owningPid) { 
     Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ServiceName" -Value $services[$j].Caption 
     $boolNoService=$false 
     break; 
     } 
    } 
    if ($boolNoService) { Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ServiceName" -Value $null } 
    $output+=$objOutput 
    } 
    $output 
} 

NetStat