2011-02-09 3 views
2
나는이 정보를 표시하는 프로그램을 작성해야

:에서 arp -a 및 경로 인쇄

  • 에서 netstat
  • TCP/UDP 연결는 IP에서 ipconfig에 대한
  • 정보/모든
  • ARP-A
  • 경로 인쇄 이미 대부분 가지고 있지만, 내가 문제와이

route printarp -a

Process p = new Process(); 

p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.FileName = "route"; 
p.StartInfo.Arguments = "PRINT"; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.CreateNoWindow = true; 
p.StartInfo.StandardOutputEncoding = Encoding.Default; 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p.Start(); 
TextBox1.Text = p.StandardOutput.ReadToEnd(); 

내가있는 ListView 나 DataGrid의 컬럼에 데이터를 얻을 수있는 foreach 루프를 사용하고 싶습니다 : 너무 아름다운 보지 않기 때문에 나는 Process.Start()를 사용하여이 명령을 실행하고 싶지 않아요. 아무도 도와 줄 수 없습니까? 이 데이터를 대상, 넷 마스크, 게이트웨이, 인터페이스, 메트릭 및 영구 경로와 같이 각 열에 어떻게 가져올 수 있습니까? 그리고 ARP의 경우, 인터넷 주소 유형의 실제 주소?

+0

죄송합니다, 그냥 내가 "에서 arp -a"에 대한 질문에 대해 잊었 본 [GetIpNetTable2 기능]을 살펴보십시오 (http://msdn.microsoft.com/en-us/library /aa814420(v=vs.85).aspx), 그게 당신이 찾고있는 것일지도 모르겠다 .C#에서 호출하는 것이 얼마나 쉬운 지 모르지만, 좀 더 쉬운 WMI 방법 일지 모르지만 나는 결코 보지 못했을 것이다. –

답변

2

아마도 내가 원하는 값을 꺼내어 ListView 등에 넣으려고 검색하는 텍스트를 구문 분석 할 수 있다고 생각합니다.하지만이 방법을 검색하는 것이 더 효과적 일 것이라고 생각합니다. WMI 클래스 Win32_IP4RouteTable을 사용하여이 정보를 얻으십시오.

이전에 WMI를 사용하지 않았다면 시작하는 데 도움이되도록 WMI Code Creator v1.0을 사용할 수 있습니다. (직접 사용하지는 않았지만 언젠가는 다른 사람이 제안했음을 알았습니다).

WMI .NET Overview도 유용 할 것입니다.

+0

도와 주셔서 감사합니다 –

+0

GetIPNetTable을 사용할 수 없습니다 :( –

1

Imparted 매우 감사드립니다. 나는 이미 감독과 IPv4routetable 다음 코드 한 WMI 코더 CREATOR와 함께 쓴 :

private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_IP4RouteTable"); 
       ListViewItem buf; 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        string destination = queryObj["Destination"].ToString(); 
        string mask = queryObj["Mask"].ToString(); 
        string metric = queryObj["Metric1"].ToString(); 
        string interfaceIndex = queryObj["InterfaceIndex"].ToString(); 
        string nexthop = queryObj["NextHop"].ToString(); 
        string protocol =queryObj["Protocol"].ToString(); 
        string type = queryObj["Type"].ToString(); 
        string status; 
        if (queryObj["Status"]!=null) 
        { 
         status = queryObj["Status"].ToString(); 
        } 
        else 
        { 
         status = string.Empty; 
        } 


        buf = new ListViewItem(new string[] {destination,mask,metric,interfaceIndex,nexthop,protocol,status,typ}); 
        list_route.Items.Add(buf); 

       } 
      } 
      catch (ManagementException ex) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); 
      } 
    } 

그냥하는 클래스 나에 대한 정보를 찾을 모르는 ARP를-A이 구글에서 찾을 수 없습니다. 누군가가 그가 대답을 요구하고 있음을 알고 있었다면. WMI Coder Creator와 같은 다른 유용한 도구가 있다면 감사하게 생각합니다.

몇 가지 정보를 발견했습니다. GetIpNetTable에 관하여 그러나 GUI 응용 프로그램에서이 기능을 사용하여 결과를 목록보기에 전달할 수는 없습니다. :. (

using System; 
using System.Runtime.InteropServices; 
using System.ComponentModel; 
using System.Net; 

namespace GetIpNetTable 
{ 
    class Program 
    { 
    // The max number of physical addresses. 
     const int MAXLEN_PHYSADDR = 8; 

    // Define the MIB_IPNETROW structure. 
     [StructLayout (LayoutKind.Sequential)] 
     struct MIB_IPNETROW 
     { 
     [MarshalAs (UnmanagedType.U4)] 
     public int dwIndex; 
     [MarshalAs (UnmanagedType.U4)] 
     public int dwPhysAddrLen; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac0; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac1; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac2; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac3; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac4; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac5; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac6; 
     [MarshalAs (UnmanagedType.U1)] 
     public byte mac7; 
     [MarshalAs (UnmanagedType.U4)] 
     public int dwAddr; 
     [MarshalAs (UnmanagedType.U4)] 
     public int dwType; 
     } 

    // Declare the GetIpNetTable function. 
     [DllImport ("Iphlpapi.dll")] 
     [Return: MarshalAs (UnmanagedType.U4)] 
     static extern int GetIpNetTable (
     IntPtr pIpNetTable, 
     [MarshalAs (UnmanagedType.U4)] 
     pdwSize ref int, 
     bool border); 

    // The Insufficient buffer error. 
     const int ERROR_INSUFFICIENT_BUFFER = 122; 

     static void Main (string [] args) 
     { 
     // The number of bytes needed. 
     bytesNeeded int = 0; 

     // The result from the API call. 
     int result = GetIpNetTable (IntPtr.Zero, ref bytesNeeded, false); 

     // Call the function, expecting an Insufficient buffer. 
     if (result! = ERROR_INSUFFICIENT_BUFFER) 
     { 
      // Throw an exception. 
      throw new Win32Exception (result); 
     } 

     // Allocate the memory, do it in a try/finally block, to ensure code 
     // That it is released. 
     IntPtr buffer = IntPtr.Zero; 

     // Try/finally. 
     try 
     { 
      // Allocate the memory. 
      buffer = Marshal.AllocCoTaskMem (bytesNeeded); 

      // Make the call again. If it did not Succeed, then 
      // Raise an error. 
      result = GetIpNetTable (buffer, ref bytesNeeded, false); 

      // If the result is not 0 (no error), then throw an exception. 
      if (result! = 0) 
      { 
      // Throw an exception. 
       throw new Win32Exception (result); 
      } 

      // Now we have the buffer, the have to marshal it. We can read 
      // The first 4 bytes to get the length of the buffer. 
      int entries = Marshal.ReadInt32 (buffer); 

      // Increment the memory pointer by the size of the int. 
      IntPtr = new IntPtr currentBuffer (buffer.ToInt64() + 
       Marshal.SizeOf (typeof (int))); 

      // Allocate an array of entries. 
      MIB_IPNETROW [] table = new MIB_IPNETROW [entries] 

      // Cycle through the entries. 
      for (int index = 0; index <entries; index + +) 
      { 
      // Call PtrToStructure, getting the information structure. 
       table [index] = (MIB_IPNETROW) Marshal.PtrToStructure (new 
        IntPtr (currentBuffer.ToInt64() + (index * 
        Marshal.SizeOf (typeof (MIB_IPNETROW)))), typeof (MIB_IPNETROW)); 
      } 

      for (int index = 0; index <entries; index + +) 
      { 

       IPAddress ip = new IPAddress (table [index]. DwAddr); 
       Console.Write ("IP:" + ip.ToString() + "\ t \ TMAC"); 
       byte b; 

       b = table [index]. mac0; 
       if (b <0x10) 
       { 
        Console.Write ("0"); 
       } 
       else 
       { 
        Console.Write (""); 
       } 
       Console.Write (b.ToString ("X")); 

       b = table [index]. mac1; 
       if (b <0x10) 
       { 
        Console.Write ("-0"); 
       } 
       else 
       { 
        Console.Write ("-"); 
       } 
       Console.Write (b.ToString ("X")); 

       b = table [index]. mac2; 
       if (b <0x10) 
       { 
        Console.Write ("-0"); 
       } 
       else 
       { 
        Console.Write ("-"); 
       } 
       Console.Write (b.ToString ("X")); 

       b = table [index]. mac3; 
       if (b <0x10) 
       { 
        Console.Write ("-0"); 
       } 
       else 
       { 
        Console.Write ("-"); 
       } 
       Console.Write (b.ToString ("X")); 

       b = table [index]. mac4; 
       if (b <0x10) 
       { 
        Console.Write ("-0"); 
       } 
       else 
       { 
        Console.Write ("-"); 
       } 
       Console.Write (b.ToString ("X")); 

       b = table [index]. mac5; 
       if (b <0x10) 
       { 
        Console.Write ("-0"); 
       } 
       else 
       { 
        Console.Write ("-"); 
       } 
       Console.Write (b.ToString ("X")); 
       Console.WriteLine(); 
      } 
     } 
     finally 
     { 
      // Release the elephant. 
      Marshal.FreeCoTaskMem (buffer); 
     } 
     } 
    } 
}