2011-02-09 5 views
2

私は、この情報を表示するプログラムを記述する必要があります。IP ipconfig/allと ARP -aとルート印刷

  • ARP-Aについて

    • netstatの
    • TCP/UDP接続
    • 情報私はすでにそれらのほとんどを持っているが、私はとの問題を抱えている
    • ルート印刷

    route printおよびarp -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

    説明ありがとうございます。私はすでに、次のコードを向けるとIPv4routetableているWMI CODERの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-の情報がGoogleで見つけることができない見つけるどのクラスにはわかりません。もし誰かが彼が答えを求めているのを知っていたら。誰かが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); 
         } 
         } 
        } 
    } 
    
    関連する問題