2009-05-22 4 views
2

Ich habe seit ein paar Tagen daran arbeiten und dies in meinem Kopf tut:Programmatically Setup eine PEAP-Verbindung in Windows Mobile

Unsere Anwendung erstellt wird, um das .NET Compact Framework 2.0 verwenden und läuft auf Windows Mobile 5 & 6 Geräte. Wir können die WLAN-Verbindung des Geräts programmgesteuert mithilfe der Wireless Zero Config-Funktionen (hier beschrieben: msdn.microsoft.com/en-us/library/ms894771.aspx), vor allem die WZCSetInterface-Funktion, die wir aus unserer Anwendung pinnen. Dies funktioniert gut für WEP- und WPA-PSK-Verbindungen.

In einem kürzlich unternommenen Versuch, Unterstützung für WPA2-Netzwerke hinzuzufügen, haben wir uns entschieden, den Code zu ändern. Wir haben erfolgreich Unterstützung für WPA2 hinzugefügt, die ein Zertifikat für die 802.1x-Authentifizierung verwendet, indem Sie vor dem Aufruf von WZCSetInterface die richtigen Registrierungseinstellungen festlegen. Jetzt möchten wir dasselbe für WPA2 mit PEAP (MS-CHAPv2) Authentifizierung tun. Beim manuellen Erstellen einer solchen Verbindung in Windows Mobile wird der Benutzer aufgefordert, die Details zu Domäne/Benutzer/Kennwort einzugeben. In unserer Anwendung werden wir diese Details lokal gespeichert haben und möchten dies alles programmatisch ohne Benutzereingriff tun.

Also dachte ich, die gleiche Route wie die Zertifikatsauthentifizierung zu gehen, die richtigen Registrierungseinträge vor dem Aufruf von WZCSetInterface.

Die Registrierungseinstellungen wir gesetzt sind: \ HKCU \ Comm \ EAP \ Config \ [ssid Name]

  • Enable8021x = 1 (DWORD)
  • LastAuthSuccessful = 1 (DWORD)
  • EapTypeId = 25 (DWORD)
  • Identität = "domain \ username" (string)
  • Passwort = binary blob das Passwort enthält, das die
    Cry verschlüsselt wird ptProtectData Funktion (hier beschrieben: msdn.microsoft.com/en-us/library/ms938309.aspx)

Aber wenn diese Einstellungen festgelegt sind, und ich rufe WZCSetInterface mit den richtigen Parametern, es fordert mich immer noch mit dem User Anmeldedialog fragt nach der Domain/Benutzername/Passwort.

Hat jemand eine Idee, was ich tun muss, um zu verhindern, dass der Passwort-Dialog erscheint und sofort mit den Einstellungen in der Registry verbunden?

Antwort

1

Nach einiger mehr Untersuchung ich schließlich gab mit den Registrierungseinstellungen auf. Es scheint, dass der Schlüssel für eine erfolgreiche Verbindung der Kennwortwert in HKCU \ Comm \ EAP \ Config [SSID] ist. Aber da CryptProtectData einen undokumentierten Entropiewert (aus offensichtlichen Sicherheitsgründen) verwendet, um das Passwort zu verschlüsseln, scheint es unmöglich, einen gültigen Eintrag in der Registry programmatisch wiederherzustellen.

Ich ging dann mit der zweitbeste Lösung, nachdem der Benutzer Anmeldedialog zu kontrollieren WZCSetInterface aufrufen und geben Sie die erforderlichen Felder in dort:

bool enteredPeapCred = false; 
DateTime timePeapCredStarted = DateTime.Now.AddSeconds(10); 

// wait for PEAP credentials window to appear (max. wait for 10 seconds) 
while (!enteredPeapCred && timePeapCredStarted >= DateTime.Now) 
{ 
    IntPtr hwndLogon = Win32.FindWindow(null, "User Logon"); 

    if (hwndLogon != IntPtr.Zero) 
    { 
    // move User Logon window offscreen to prevent screen flicker in app 
    Win32.MoveWindow(hwndLogon, -600, 0, 320, 480, true);        

    // "Network Log On" label 
    IntPtr hwndCtrl1 = Win32.GetWindow(hwndLogon, Win32.GW_CHILD); 
    // "Enter network info..." label 
    IntPtr hwndCtrl2 = Win32.GetWindow(hwndCtrl1, Win32.GW_HWNDNEXT); 
    // "User name:" label 
    IntPtr hwndCtrl3 = Win32.GetWindow(hwndCtrl2, Win32.GW_HWNDNEXT); 
    // username textbox 
    IntPtr hwndCtrl4 = Win32.GetWindow(hwndCtrl3, Win32.GW_HWNDNEXT); 
    // "Password:" label 
     IntPtr hwndCtrl5 = Win32.GetWindow(hwndCtrl4, Win32.GW_HWNDNEXT); 
    // password textbox 
    IntPtr hwndCtrl6 = Win32.GetWindow(hwndCtrl5, Win32.GW_HWNDNEXT); 
    // enter password into textbox 
    StringBuilder sbPassword = new StringBuilder(); 
    sbPassword.Append(eapPassword); 
    Win32.SetWindowText(hwndCtrl6, sbPassword); 
    // "Domain:" label 
    IntPtr hwndCtrl7 = Win32.GetWindow(hwndCtrl6, Win32.GW_HWNDNEXT); 
    // domain textbox 
    IntPtr hwndCtrl8 = Win32.GetWindow(hwndCtrl7, Win32.GW_HWNDNEXT); 
    // "Save password" checkbox 
    IntPtr hwndCtrl9 = Win32.GetWindow(hwndCtrl8, Win32.GW_HWNDNEXT); 
    // send BST_CHECKED message to set checkbox 
    Win32.SendMessage(hwndCtrl9, Win32.BM_SETCHECK, Win32.BST_CHECKED, 0);         

    // send WM_COMMAND with left softkey to submit user dialog 
    IntPtr hwndMenu = Win32.SHFindMenuBar(hwndLogon); 
    Win32.SendMessage(hwndLogon, Win32.WM_COMMAND, 0x2F87, hwndMenu.ToInt32()); 

    enteredPeapCred = true;         
    } 
} 

Bitte beachte, dass ich nur das Passwortfeld habe die Einrichtung, weil der Benutzername und Domänenfelder sind bereits mit den bereits in der Registrierung gespeicherten Informationen ausgefüllt (der Identity-Wert, der in meiner ursprünglichen Frage erwähnt wurde).

Dies funktioniert gut genug, da es die WLAN-Verbindung mit den PEAP-Anmeldeinformationen erstellt. Wenn Sie den Benutzeranmeldedialog bei der Suche sofort offline schalten, geschieht dies alles unsichtbar für den Benutzer unserer Anwendung (unsere App läuft im Kioskmodus).

0

Ich weiß nicht, ob dies Ihnen helfen oder nicht, aber ich hatte das gleiche Problem und fügte hinzu, Registrierungseinträge, bis etwas repariert es. Ich bin nicht sicher, welche davon sie fest, aber hier sind die Einträge Ich verwende (herausgegeben zum Thema Sicherheit Info zu verbergen):

Windows Registry Editor Version 5,00

[HKEY_LOCAL_MACHINE\Comm\SecurityProviders\SCHANNEL] 
"RNG"=- 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WZCSVC\Parameters] 
"ContextSettings"=hex:\[REMOVED] 

[HKEY_LOCAL_MACHINE\System\DPAPIKeys\System] 
@=hex:\[REMOVED] 

[HKEY_LOCAL_MACHINE\System\DPAPIKeys\default] 
@=hex:\[REMOVED] 

[HKEY_LOCAL_MACHINE\init\BootVars] 
"MasterKeysInRegistry"=dword:1 

[HKEY_CURRENT_USER\Comm\EAPOL\Config\[REMOVED]] 
"LastAuthSuccessful"=dword:00000001 
"Password"=hex:\[REMOVED] 
"Identity"=[REMOVED] 
"EapTypeId"=dword:00000019 
"Enable8021x"=dword:00000001 

[HKEY_CURRENT_USER\Comm\EAPOL\Config\[REMOVED]\25] 
"ConnectionData"=hex:[REMOVED] 

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Ethman\Popup] 
"Enable"=dword:00000000 
"Timeout"=dword:0000000F 

[HKEY_CURRENT_USER\System\Credentials\Type\2] 
@=hex:\[REMOVED] 
+0

@Ian: Ich werde versuchen, dies in den nächsten Wochen zu testen, wenn ich Zeit habe und ich werde meine Ergebnisse hier posten. –

+1

@Ian: Können Sie mir sagen, wie Sie die in einigen Werten eingegebenen Informationen generiert haben? Wie haben Sie zum Beispiel die DPAPIKeys-Einträge erhalten? –

0

Wir haben positive Erfahrungen mit dem Projekt wpa_supplicant unter Windows CE 5.0 und 6.0 gemacht. Ich weiß nicht, ob es unter WM funktioniert, aber ich nehme an, es tut es.

Die Integration in unsere Anwendung erforderte einige Anstrengungen (z. B. Erstellen eines Dienstes um den Kern wpa_supplicant, Deaktivieren des Zero-Configuration-Treibers). Es hat sich jedoch gelohnt: Unsere Anwendung hat die volle Kontrolle über den gesamten Konfigurations-/Assoziationsprozess.

+0

@Christian: Ich habe mir das auch kurz angeschaut, aber die Arbeit, um damit Schritt zu halten und diese in unsere Software zu integrieren, würde zu lange dauern. –

0

Der User Logon Dialog wahrscheinlich wegen der in

HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\. 

Die Tasten "InvokePasswordDialog" und "InvokeUserNameDialog" basierte Tasten-Eingabeaufforderung den Wert 1.

versuchen, sie auf 0

zu wechseln
+0

Das habe ich auch schon probiert, aber es macht keinen Unterschied. Danke für den Vorschlag. –