どっとねっとふぁん

C# Tips And Samples
in 検索

WMI(ManagementObject) の配列の扱いについて

最新の投稿は、投稿日時: 09-08-2005, 5:41 午後 投稿者: Task-64 です。スレッドには 4 件の返答があります。
投稿のソート: 前へ 次へ
  •  09-08-2005, 12:44 午後 364

    WMI(ManagementObject) の配列の扱いについて

    こんにちは。

    配列の処理でエラーから抜け出せず、2日間調べまくったのですが、まだ悩んでいます・・。
    どなたかアドバイスをお願いできればと思います。(部分的なコードを載せさせていただきます)

    【やりたいこと】
    ・ WMIをつかってリモートでサーバ(又はクライアント)のIPアドレス等を取得し、画面出力したい。

    【困っていること】
    ・ プロパティ "IPAddress" (System.String [] )をマルチラインのTextBoxに(txtResult.Text)に出力したいが、どう(キャスト?)すればよいかわからない
    ・ デバッグ中にイミディエイトウィンドウで manage["IPAddress"] を調べると、192.168.0.1 のように出力される(出力できる)理由がわからない。

    query = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"; 
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
        ManagementObjectCollection col = searcher.get()

       foreach ( ManagementObject manage in col )
       {
        txtResult.Text += "Network Adapter " + i + "\r\n";
        txtResult.Text += "=================" + "\r\n";
        txtResult.Text += "  Description: " + manage["Description"].ToString() + "\r\n";
        txtResult.Text += "  Physical (MAC) address: " + manage["MACAddress"].ToString() + "\r\n";
        txtResult.Text += "  Host name:              " + manage["DNSHostName"].ToString() + "\r\n";

        ' manage["IPAddress"] をどう扱えばよいのかわからない・・
        txtResult.Text += "  IP address:             " + manage["IPAddress"];

  •  09-08-2005, 5:01 午後 365 返答元: 364

    Re: WMI(ManagementObject) の配列の扱いについて

    string型の配列にキャストして、その最初の値を取り出すことで表示できたと思います。
    次のようになるかな?

    txtResult.Text += "  IP address:             " + ((string[])manage["IPAddress"])[0]

    なぜ最初の値だったかは忘れてしまっているので、WMIのドキュメントで確認してください。
    ちなみに、WMIの使い方がちょっと違っちゃってますが、次のプログラムで自分のマシンのIPアドレスを取り出すことができます。

    using System.Management;

    class ConsoleSample
    {
        public static void Main()
        {
            ManagementScope scope = new ManagementScope("root\\cimv2");
            scope.Connect();
            ManagementClass osClass = new ManagementClass(scope, new ManagementPath("Win32_NetworkAdapterConfiguration"), null);
            ManagementObjectCollection collection = osClass.GetInstances();
            foreach( ManagementObject mo in collection )
            {
                if((bool)mo.Properties["IPEnabled"].Value == true)
                {
                    System.Console.WriteLine(((string[])mo["IPAddress"])[0]);
                }
            }
        }
    }


    あおい情報システム株式会社
     小野修司(どっとねっとふぁん)
  •  09-08-2005, 5:41 午後 366 返答元: 365

    Re: WMI(ManagementObject) の配列の扱いについて

    おのさん。ありがとうございます!

    txtResult.Text += "  IP address:             " + ((string[])manage["IPAddress"])[0]

    教えて頂いた通りでうまくいきました。
    質問する前は分からなかったのですが、「string 型の配列なのだから、string [] でキャストすればよい」と。
    低レベルな質問で申し訳ないです。WMIが好きで色々と試しているのですが、キャストに苦しめられてます・・。
    (でも最近は現象傾向にあります)

    ちなみに、なぜこの"IPAddress"プロパティが配列で返されるのか?という疑問があるのですが、http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp

    ↑には「配列で返すから、for each で回して値を取れよー」みたいなことしか書いてありませんでした。
    ["IPAddress"][1] と書くような状況(又はforeach で回す)ってあるのでしょうか?たとえばチーミングとかでIPが2つ返ってきたりするのでしょうか・・・?

    何はともあれご回答いただきありがとうございました。これでまた先に進めます。(・o・)/

  •  09-08-2005, 6:02 午後 368 返答元: 366

    Re: WMI(ManagementObject) の配列の扱いについて

     Task-64 wrote:

    ["IPAddress"][1] と書くような状況(又はforeach で回す)ってあるのでしょうか?

    ああ、思い出した。
    XPとかだと、1つのNICに複数のIPアドレスを振ることができます。
    設定するにはTCP/IPのプロパティのところで詳細設定ボタンを押して、IP設定タブの中でIPアドレスを追加していきます。
    この複数のIPアドレスが配列になって帰ってくるのでした。

    いま確かめてみたので間違いないです(w


    あおい情報システム株式会社
     小野修司(どっとねっとふぁん)
  •  09-09-2005, 11:45 午前 369 返答元: 368

    Re: WMI(ManagementObject) の配列の扱いについて

    わたくしも確認してみました。たしかに[追加]でひとつのNICに複数のIPを振れるようです。
    なるほど・・それで配列、ですね。
    いろいろと勉強になりました。

    またよろしくお願いします!

     

RSS ニュースフィードで参照
SkinName:iroha_CS2
Powered by Community Server, by Telligent Systems