Toon posts:

[C#] Netwerkkaart herstarten mbv WMI of API?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen. Al een geruime tijd ben ik opzoek naar de mogelijkheid om mbv code een netwerkkaart te herstarten. (of dan wel uitschakelen en weer in) Om dit voor elkaar te krijgen ben ik bezig geweest met WMI. In de volgende code gebruik ik de API : CIM_NetworkAdapter. (http://msdn.microsoft.com...mi/cim_networkadapter.asp )

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM CIM_NetworkAdapter");
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject mo in queryCollection ) 
{
    Console.WriteLine( mo["Name"] );
    if ( (string)mo["Name"] == "3Com 3CRPAG175 Wireless LAN PC Card" )
    {
        try
        {
            ManagementBaseObject inParams = mo.GetMethodParameters("Reset");
            mo.InvokeMethod("Reset", inParams, null );
        }
        catch ( Exception e )
        {
            Console.WriteLine(e.ToString());
        }
    }
}


Hiermee kom ik een heel eind. Alleen “werkt” de invokeMethode niet omdat zoals aangegeven in MSDN is de methode Reset niet in WMI geïmplementeerd. Ik neem aan dat dit de oorzaak is van de exception.

Dus ben ik het gaan proberen om de API aan te spreken direct via een DLL import. Uit een boek heb ik de volgende code, na wat aanpassingen, aan de praat gekregen. Het voorbeeld werkt met de API GetSystemInfo() maar werkt het zelfde als CIM_NetworkAdapter. Je vangt de informatie in een Struct af.

code:
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
34
35
36
37
38
39
40
41
using System;
using System.Runtime.InteropServices;

class CH4_14
{
    [System.Runtime.InteropServices.StructLayoutAttribute (LayoutKind.Sequential, CharSet=CharSet.Auto)]
        public struct _SYSTEM_INFO
    { 
        public int dwOemID; 
        public int dwPageSize;
        public int lpMinimumApplicationAddress; 
        public int lpMaximumApplicationAddress; 
        public int dwActiveProcessorMask; 
        public int dwNumberOfProcessors;
        public int dwProcessorType;
        public int dwAllocationGranularity;
        public short wProcessorLevel;
        public short wProcessorRevision;
    }

    [DllImport("Kernel32.dll")]
    unsafe private static extern void GetSystemInfo(uint* bufptr);
    
    public static unsafe void Main()
    {
        try
        {
            _SYSTEM_INFO si = new _SYSTEM_INFO();
            GetSystemInfo( (uint *)&si );
            Console.WriteLine("Processor-type = {0}", si.dwProcessorType );
            Console.WriteLine("Aantal processoren = {0}", si.dwNumberOfProcessors );
            Console.WriteLine("Processor-niveau = {0}", si.wProcessorLevel );
            Console.WriteLine("Processor-revisie = {0}", si.wProcessorRevision );
        }
        catch ( Exception e )
        {
            Console.WriteLine("Exception afgevangen! {0}", e );
        }
    }
   
}


Nu vraag ik me af als ik deze code gebruik voor CIM_NetworkAdapter hoe ik dan de methode Reset kan aanspreken. (ook iets met een InvokeMethode ofzo?) En eigenlijke de grootste vraag: “Is dit wel de Reset methode waar ik naar opzoek ben?” Het zou zo maar kunnen dat ik op een compleet verkeerd spoor zit.

Bij voorbaat dank voor het mee denken! _/-\o_

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik denk dat je met deze 2de code weerom WMI wil aanspreken, maar als het op de ene plaats niet is geimplementeerd, dan is het nergens geimplementeerd.

Kun je niet van het "net" commando gebruik maken via een shell commando ?
Het is waarschijnlijk de simpelste oplossing, maar werken zal ze op de meest Win OS'en

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Hehe dat zou wel heel makkelijk zijn, maar mooi als het werkt. Maar eens kijken naar de mogelijkheden van het 'net' commando.

Verwijderd

Met het commando "net" kan je iig je netwerkkaart niet herstarten, daarvoor heb je devcon.exe nodig. Dat is een device manager voor nt-based dos van Microsoft.

Zie ook: GoTwiki - Batch_programmeren - Computer beheer.

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Eerst maar eens de vraag wat je met die reset wilt bereiken.
Als je de kaart naar een ander SSID wilt laten zoeken, zou 'k eens kijken of 3Com MSNdis_80211_Disassociate (in root\WMI) geïmplementeerd heeft.
Als je een ander IP-adres wilt, kun je het DHCP adres releasen en renewen

QnJhaGlld2FoaWV3YQ==


Verwijderd

Topicstarter
Ik wil die reset omdat ik een macadres wil aanpassen. Die wordt pas doorgevoerd na een herstart.

Verwijderd

Topicstarter
Ik heb het nu werken met de volgende code voor 1 specifieke netwerkkaart: ( op PNPDeviceID == PCI\VEN_A727 )

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            Process myProcess = new Process();
            string executable = "devcon";
            string argumentes1 = @"disable PCI\VEN_A727";
            string argumentes2 = @"enable PCI\VEN_A727";
            
            try
            {
                myProcess.StartInfo.FileName = executable;
                myProcess.StartInfo.Arguments = argumentes1;
                myProcess.StartInfo.CreateNoWindow = true;
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.Start();

                myProcess.WaitForExit();

                myProcess.StartInfo.Arguments = argumentes2;
                myProcess.Start();

            }
            catch (Exception ex)
            {
                Console.WriteLine( ex.ToString() );
            }


Ik heb nu het bestand "devcon.exe" in de root map staan van de applicatie. ("devcon.exe" zit niet standaard in WIN XP en kun je dl op http://support.microsoft....spx?scid=kb;EN-US;Q311272 )

Toch zou ik liever zien dat ik het zonder extern programma voor elkaar krijg. (perfectionist ;) )

Iemand nog een geniaal idee?

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

De source code van DevCon is beschikbaar in MSDN: http://msdn.microsoft.com...94be-a66f8db40fdf.xml.asp
Met een beetje puzzlewerk moet je het relevante gedeelte daar wel kunnen vinden.

QnJhaGlld2FoaWV3YQ==

Pagina: 1