arp -a и печать маршрута - PullRequest
       21

arp -a и печать маршрута

2 голосов
/ 09 февраля 2011

Мне нужно написать программу, которая отображает эту информацию:

  • netstat
  • TCP / UDP-соединения
  • Информация об IP ipconfig / all
  • arp-a
  • route print

Большинство из них у меня уже есть, но у меня проблема с route print и arp -a.Я не хочу выполнять эту команду, используя Process.Start(), потому что она не выглядит слишком эффектно:

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();

Я хотел бы использовать цикл foreach для получения данных в столбцы ListView или DataGrid.Кто-нибудь может мне помочь?Как я могу получить эти данные в каждом столбце: место назначения, маска сети, шлюз, интерфейс, метрики и постоянный маршрут?А в случае ARP, интернет-адрес типа физического адреса?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Полагаю, вы могли бы просто проанализировать полученный текст, чтобы получить значения, которые вы хотите, и поместить их в ListView и т. Д. Однако, я думаю, что есть лучшие способы получить это, и я думаю, что вы будетевозможность получить эту информацию с помощью класса WMI Win32_IP4RouteTable .

Если вы раньше не использовали WMI, возможно, вы сможете использовать WMI Code Creator v1.0 , чтобы помочь вам начать работу (я сам этим не пользовался, но видел, как кто-то другой когда-нибудь предлагал это).

Обзор WMI .NET , вероятно, также будет полезен.

1 голос
/ 09 февраля 2011

Передано Спасибо большое.Я уже писал с WMI CODER CREATOR, который направил и IPv4routetable следующий код:

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, не могу найти в Google.Если кто-то знал, он спрашивал ответ.Если у кого-то есть другие полезные средства, такие как WMI Coder Creator, был бы благодарен.

Я нашел некоторую информацию.О GetIpNetTable, но я не могу использовать эту функцию в приложениях с графическим интерфейсом, чтобы передать результат в просмотр списка.: (

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);
         }
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...