[C#/WMI] Alleen IPv4 adressen opvragen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Ik vraag via WMI een lijstje IP's op en wil hiervan alleen de IPv4 adressen weergeven/gebruiken.

Ik heb nu de volgende 'testcode' maar ik vraag me af of het niet mogelijk is enkel de IPv4 adressen op te vragen aangezien ik deze methode wat ranzig vind (imo) :P

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
ManagementObjectSearcher objSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
ManagementObjectCollection objCollection = objSearcher.Get();
foreach (ManagementObject obj in objCollection)
{
    string[] AddressList = (string[])obj["IPAddress"];
    foreach (string Address in AddressList)
    {
        if (!Address.Contains(":"))
        {
            Console.WriteLine(Address);
        }
    }
}

Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 17-09 16:20
Enigzins offtopic, maar waarom zou je dit willen? Anno 2010 lijkt het me niet meer dan logisch om _juist_ ook ipv6 te ondersteunen?

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Je kunt met de ip address class dit doen:

C#:
1
2
3
4
5
6
7
8
9
    IPAddress address;
    if (IPAddress.TryParse(input, out address))
    {
        if(address.AddressFamily == System.Net.Sockets.AddressFamily.InternetWork) //IPV4
//IPV6 is InternetWork6
       { 
            //do stuff;
        }
    }

[ Voor 3% gewijzigd door roy-t op 30-07-2010 16:30 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
freakingme schreef op vrijdag 30 juli 2010 @ 16:23:
Enigzins offtopic, maar waarom zou je dit willen? Anno 2010 lijkt het me niet meer dan logisch om _juist_ ook ipv6 te ondersteunen?
Die vraag had ik verwacht inderdaad.
Uiteindelijk gaat dit een progje worden die aan de hand van het huidige IP adres en een .xml file de locatie van een van onze vestigingen gaat teruggeven.
Sterker nog, dit programma was er al en werkte prima, totdat het in gebruik kwam op Windows 7 en Windows Server 2008.

De 'oude' methode van adressen opvragen was deze (stukje code uit een example van Microsoft):
C#:
1
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());


Dat werkte tot voor kort dus prima, zei het niet dat Windows 7/2008 hier standaard het IPv6 adres teruggeven ipv het IPv4 adres.

Aangezien IPv6 binnen ons corporate netwerk de eerste heelveel jaar (voornamelijk om legacy redenen mbt hardware in productie en dergelijke, en geen tekort aan adressen) toch niet in gebruik genomen gaat worden loont het dus niet de moeite om de extra tijd er in te steken dit IPv6 compatible te maken.
Ik heb er wel naar gekeken, maar voor een simpel tooltje als dit zie ik die extra uren werk niet als nodig. Mogelijk dat ik het er later nog eens inhack en 'm update als ik tijd over heb (eens per jaar ga ik al m'n oude projecten langs die nog in gebruik zijn op zoek naar mogelijke verbeteringen).

Het XML-deel werkt gewoon prima, maar voor de nieuwsgierigen, hiervoor gebruiken we de volgende opmaak:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <site>
        <description>NLVUN</description>
        <range>10.166.64.0/22</range>
    </site>
    <site>
        <description>NLKOS</description>
        <range>10.166.124.0/22</range>
    </site>
    <site>
        <description>GBBIM</description>
        <range>172.28.1.0/24</range>
    </site>
</root>

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
roy-t schreef op vrijdag 30 juli 2010 @ 16:29:
Je kunt met de ip address class dit doen:

C#:
1
2
3
4
5
6
7
8
9
    IPAddress address;
    if (IPAddress.TryParse(input, out address))
    {
        if(address.AddressFamily == System.Net.Sockets.AddressFamily.InternetWork) //IPV4
//IPV6 is InternetWork6
       { 
            //do stuff;
        }
    }
Danku danku, getest (niet op de meest nette wijze maargoed) en werkt prima :-)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Management;
using System.Net;

namespace NetDentifier
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher objSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
            ManagementObjectCollection objCollection = objSearcher.Get();
            foreach (ManagementObject obj in objCollection)
            {
                string[] AddressList = (string[])obj["IPAddress"];
                foreach (String Address in AddressList)
                {
                    IPAddress address;
                    if (IPAddress.TryParse(Address, out address))
                    {
                        if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            Console.WriteLine(Address);
                        }
                    }
                }
            }
        }
    }
}

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Noxious schreef op vrijdag 30 juli 2010 @ 16:33:
[...]

De 'oude' methode van adressen opvragen was deze (stukje code uit een example van Microsoft):
C#:
1
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
Lol! Ik wist dit stukje code omdat ik vandaag exact bovenstaande code heb vervangen door een forloop die het eerste IPV4 adres terug geeft ipv gewoon die op index 0! Blijkbaar zijn er meer mensen W7 probleempjes aan het fixen vandaag :> .

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
roy-t schreef op vrijdag 30 juli 2010 @ 16:46:
[...]


Lol! Ik wist dit stukje code omdat ik vandaag exact bovenstaande code heb vervangen door een forloop die het eerste IPV4 adres terug geeft ipv gewoon die op index 0! Blijkbaar zijn er meer mensen W7 probleempjes aan het fixen vandaag :> .
Haha ja ik ben toch een lading antieke ranzige code tegengekomen van mezelf, ongelofelijk :P :D

Constructies als:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
            IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
            foreach (IPAddress IP in localIPs){
                if (IP.ToString() != null)
                {
                    CurIPAddress.Add(IP.ToString().Trim());
                    IPOctet1.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[0]), 2).PadLeft(8, '0'));
                    IPOctet2.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[1]), 2).PadLeft(8, '0'));
                    IPOctet3.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[2]), 2).PadLeft(8, '0'));
                    IPOctet4.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[3]), 2).PadLeft(8, '0'));
                    CurIPAddressBin.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[0]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[1]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[2]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[3]), 2).PadLeft(8, '0'));
                    i++;
                }
            }


:') :9~ :$

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Wow... wow die kan zo in het andere topic!

~ Mijn prog blog!

Pagina: 1