SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

ルーティングテーブルの取得 (C#)(F#)


WMI(WindowsManagementInstrumentation) からルーティングテーブルの情報を取得することができます。
サンプルは、「route print -4」とした時と同じです。
なお、インターフェースは、「Win32_IP4RouteTable」クラスでは、インデックス番号しか取得できませんので、IPアドレスが必要な場合は別途取得が必要です。
※参照設定で「System.Management」を追加する必要があります。

C#サンプル


using System;
using System.Management;

namespace Example {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("ネットワーク宛先tネットマスクtゲートウェイtインターフェイスtメトリック");
            ManagementObjectSearcher ms = new ManagementObjectSearcher("select * from Win32_IP4RouteTable");
            foreach (var m in ms.Get()) {
                var name = m["Name"];
                var mask = m["Mask"];
                var nextHop = m["NextHop"];
                if ((string)nextHop == "0.0.0.0") {
                    nextHop = "リンク上";
                }
                var interfaceIndex = m["InterfaceIndex"];
                var metric1 = m["Metric1"];
                Console.WriteLine("{0,15}t{1,15}t{2,15}t{3,2}t{4}", name, mask, nextHop, interfaceIndex, metric1);
            }
            Console.WriteLine();
            Console.WriteLine("何かのキーを押してください。");
            Console.ReadKey();
        }
    }
}

F#サンプル

open System.Management
open System.Linq

printfn "ネットワーク宛先tネットマスクtゲートウェイtインターフェイスtメトリック"
let ms = new ManagementObjectSearcher("select * from Win32_IP4RouteTable")
ms.Get().Cast<ManagementObject>()
|> Seq.iter(fun m ->
    let name = m.["Name"]:?>string
    let mask = m.["Mask"]:?>string
    let nextHop = 
        let n = m.["NextHop"]:?>string
        if n = "0.0.0.0" then "リンク上" else n
    let interfaceIndex = m.["InterfaceIndex"]:?>int
    let metric1 = m.["Metric1"]:?>int
    printfn "%-15st%-15st%-15st%dt%d" name mask nextHop interfaceIndex metric1  )

printfn "何かのキーを押してください。"
Console.ReadKey() |> ignore