PDA

View Full Version : [C#] Connettersi ad una rete wifi


pare93
08-07-2011, 19:05
Salve a tutti,
sto cervcando di creare un programmino in C# che si collegi ad una determinata rete wifi protetta in WPA.
In rete ho trovato la libreria "ManagedWifi.dll" e più precisamente sono andato a visitare questa pagina web : http://managedwifi.codeplex.com/

Ho scaricato il codice sorgente che postano come esempio ma non riesco a capire l' ultima parte, quella dove il client si connette alla rete.

Posto il codice.

using NativeWifi;
using System;
using System.Text;

namespace WifiExample
{
class Program
{
/// <summary>
/// Converts a 802.11 SSID to a string.
/// </summary>
static string GetStringForSSID(Wlan.Dot11Ssid ssid)
{
return Encoding.ASCII.GetString( ssid.SSID, 0, (int) ssid.SSIDLength );
}

static void Main( string[] args )
{
WlanClient client = new WlanClient();
foreach ( WlanClient.WlanInterface wlanIface in client.Interfaces )
{
// Lists all networks with WEP security
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList( 0 );
foreach ( Wlan.WlanAvailableNetwork network in networks )
{
if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP )
{
Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
}
}

// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach ( Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles() )
{
string name = profileInfo.profileName; // this is typically the network's SSID
string xml = wlanIface.GetProfileXml( profileInfo.profileName );
}

// Connects to a known network with WEP security
string profileName = "Cheesecake"; // this is also the SSID
string mac = "52544131303235572D454137443638";
string key = "hello";
string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key);
wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true );
wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );
}
}
}
}


Ecco riuscete a spiegarmi l' ultima parte del codice, quella riguardante la connessione alla rete ?

Grazie in anticipo :)

3nigma666
09-07-2011, 12:04
Salve a tutti,
sto cervcando di creare un programmino in C# che si collegi ad una determinata rete wifi protetta in WPA.
In rete ho trovato la libreria "ManagedWifi.dll" e più precisamente sono andato a visitare questa pagina web : http://managedwifi.codeplex.com/

Ho scaricato il codice sorgente che postano come esempio ma non riesco a capire l' ultima parte, quella dove il client si connette alla rete.

Posto il codice.
k
using NativeWifi;
using System;
using System.Text;

namespace WifiExample
{
class Program
{
/// <summary>
/// Converts a 802.11 SSID to a string.
/// </summary>
static string GetStringForSSID(Wlan.Dot11Ssid ssid)
{
return Encoding.ASCII.GetString( ssid.SSID, 0, (int) ssid.SSIDLength );
}

static void Main( string[] args )
{
WlanClient client = new WlanClient();
foreach ( WlanClient.WlanInterface wlanIface in client.Interfaces )
{
// Lists all networks with WEP security
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList( 0 );
foreach ( Wlan.WlanAvailableNetwork network in networks )
{
if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP )
{
Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
}
}

// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach ( Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles() )
{
string name = profileInfo.profileName; // this is typically the network's SSID
string xml = wlanIface.GetProfileXml( profileInfo.profileName );
}

// Connects to a known network with WEP security
string profileName = "Cheesecake"; // this is also the SSID
string mac = "52544131303235572D454137443638";
string key = "hello";
string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key);
wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true );
wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );
}
}
}
}


Ecco riuscete a spiegarmi l' ultima parte del codice, quella riguardante la connessione alla rete ?

Grazie in anticipo :)
spiega bene quale e' il problema, cosa non capisci? che riga del codice ti e' oscura?

pare93
09-07-2011, 12:20
string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key);
wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true );
wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );

Innanzitutto non capisco cosa indica la stringa "profileXml", leggendo serve per inserire i parametri della connessione.
E il metodo "SetProfile" vorrei sapere cosa fa di preciso e quindi anche il metodo "Connect".

Ecco questa è la parte che mi è oscura :)

pare93
09-07-2011, 17:05
Riporto una parte di codice dove mi dà errore.

string nomeProfilo = lstNetwork[0].profileName;
string mac = Convert.ToString(wlanInterface.InterfaceGuid);
string pass = "mia_password";
string profiloXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{1}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", nomeProfilo, pass);
wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profiloXml, true);
wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, nomeProfilo);

Dove wlanInterface è dato da :

NativeWifi.WlanClient wlanclient = new NativeWifi.WlanClient();
wlanInterface = wlanClient.Interfaces[index];

L' errore che mi dà è riportato all' interno della libreria "NativeWifi".
Posto il metodo dove il compilatore mi trova l' errore.

public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite)
{
Wlan.WlanReasonCode reasonCode;
Wlan.ThrowIfError(
Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode));
return reasonCode;
}

E dice che il profilo è danneggiato.

Però a me sembra di aver impostato come codice SSID quello giusto e la pass nel foglio XML.

Help me!

3nigma666
10-07-2011, 19:01
SetProfile fa questo:


/// <summary>
/// Sets the profile.
/// </summary>
/// <param name="flags">The flags to set on the profile.</param>
/// <param name="profileXml">The XML representation of the profile. On Windows XP SP 2, special care should be taken to adhere to its limitations.</param>
/// <param name="overwrite">If a profile by the given name already exists, then specifies whether to overwrite it (if <c>true</c>) or return an error (if <c>false</c>).</param>
/// <returns>The resulting code indicating a success or the reason why the profile wasn't valid.</returns>
public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite)
{
Wlan.WlanReasonCode reasonCode;
Wlan.ThrowIfError(
Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode));
return reasonCode;
}





In sostanza passa il profilo del client che si sta collegando e restituisce lo stato, ovvero se è stato accettato o meno il profilo passato al router.




string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key);
wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true );
wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );



non fa altro che creare una stringa che contiene il testo dell'ipotetico file xml che il router accetta in ingresso con tutti i settaggi.


che versione di windows utilizzi?
hai almeno windows Xp? se usi Xp ricordati che devi applicare la hotfix KB article 918997 come indicato sul sito che hai linkato.

Io purtroppo uso Visual Studio 2010 e il progetto è fatto in unaversione piu vecchia e mettermi a convertirlo per provarlo diventa na rottura di p... :) !

Comuqnue fai un debug e passo passo guarda in che riga ti da errore e l'errore che ti restituisce postalo qua.

pare93
11-07-2011, 11:01
Devo dire che uso anche io Visual studio 2010 e ho convertito il progetto senza problemi.

Comunque l' errore che mi dà e proprio sulle stringhe di codice che hai postato :

public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite)
{
Wlan.WlanReasonCode reasonCode;
Wlan.ThrowIfError(
Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode));
return reasonCode;
}

Sono relative al settaggio del profilo che si connette al router da come mi hai accennato.
L' errore è "profilo danneggiato".

Come parametri nel foglio XML gli dò :

- nomeProfilo = SSID del router ( alice-00000000)
- indirizzoMac = indirizzo fisico
- key = password del mio router

Ciao.

3nigma666
12-07-2011, 14:45
Devo dire che uso anche io Visual studio 2010 e ho convertito il progetto senza problemi.

Comunque l' errore che mi dà e proprio sulle stringhe di codice che hai postato :

public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite)
{
Wlan.WlanReasonCode reasonCode;
Wlan.ThrowIfError(
Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode));
return reasonCode;
}

Sono relative al settaggio del profilo che si connette al router da come mi hai accennato.
L' errore è "profilo danneggiato".

Come parametri nel foglio XML gli dò :

- nomeProfilo = SSID del router ( alice-00000000)
- indirizzoMac = indirizzo fisico
- key = password del mio router

Ciao.



Se gli stai passando come passoword del tuo router la frase che hai scelto come password (esempio: AUTOMOBILE), prova a passargli la tua parola chiave tradotta in codice esadecimale tipo: E514D495

pare93
14-07-2011, 09:13
Niente da fare

pare93
17-11-2011, 16:03
Qualcuno sa come usare questa library per collegarsi ad un access point ?
Grazie mille.

Kenger
18-11-2011, 13:11
Questo viene da un programma che avevo fatto tempo fa ( che secondo me faceva la stessa cosa che vuoi far tu visto il router alice :D)

String profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>WPAPSK</authentication><encryption>TKIP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", SSID, password);

WlanClient.WlanInterface wlanIface = new WlanClient().Interfaces[0];

Wlan.WlanReasonCode reasonasdasdasd = wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);

wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, SSID);

Se non ricordo male funzionava!

pare93
18-11-2011, 19:10
Questo viene da un programma che avevo fatto tempo fa ( che secondo me faceva la stessa cosa che vuoi far tu visto il router alice :D)

String profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>WPAPSK</authentication><encryption>TKIP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", SSID, password);

WlanClient.WlanInterface wlanIface = new WlanClient().Interfaces[0];

Wlan.WlanReasonCode reasonasdasdasd = wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);

wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, SSID);

Se non ricordo male funzionava!


Ok, Grazie mille. Lo provo il prima possibile.
Per caso sai anche se è possibile costruire una rete ad hoc con questa libreria?

pare93
20-11-2011, 10:13
up