Программно настроить соединение PEAP в Windows Mobile - PullRequest
2 голосов
/ 22 мая 2009

Я работал над этим в течение нескольких дней, и это делает мою голову в:

Наше приложение создано с использованием .NET Compact Framework 2.0 и работает на устройствах Windows Mobile 5 & 6. Мы можем установить WLAN-соединение устройства программно, используя функции Wireless Zero Config (описанные здесь: msdn.microsoft.com/en-us/library/ms894771.aspx), в частности, функцию WZCSetInterface, которую мы извлекаем из нашего приложения. Это прекрасно работает для соединений WEP и WPA-PSK.

В недавнем стремлении добавить поддержку сетей WPA2 мы решили изменить код. Мы успешно добавили поддержку WPA2, которая использует сертификат для аутентификации 802.1x, установив правильные параметры реестра перед вызовом WZCSetInterface. Теперь мы хотим сделать то же самое для WPA2, используя аутентификацию PEAP (MS-CHAPv2). При создании такого подключения вручную в Windows Mobile пользователю будет предложено ввести данные домена / пользователя / пароля. В нашем приложении эти данные будут храниться локально, и мы хотим сделать все это программно без какого-либо вмешательства пользователя.

Поэтому я решил пойти по тому же маршруту, что и проверка подлинности сертификата, установить правильные записи реестра перед вызовом WZCSetInterface.

Установленные нами параметры реестра: \ HKCU \ Comm \ EAP \ Config \ [имя ssid]

  • Enable8021x = 1 (DWORD)
  • LastAuthSuccessful = 1 (DWORD)
  • EapTypeId = 25 (DWORD)
  • Identity = "домен \ имя пользователя" (строка)
  • Password = двоичный двоичный объект, содержащий пароль, зашифрованный с помощью
    Функция CryptProtectData (описана здесь: msdn.microsoft.com/en-us/library/ms938309.aspx)

Но когда эти настройки установлены, и я вызываю WZCSetInterface с правильными параметрами, он все равно запрашивает у меня диалоговое окно входа в систему, запрашивая домен / имя пользователя / пароль.

Кто-нибудь понял, что мне нужно сделать, чтобы диалоговое окно с паролем не появлялось и не связывалось с настройками, хранящимися в реестре?

Ответы [ 4 ]

1 голос
/ 25 февраля 2010

После еще одного расследования я в конечном итоге отказался от настроек реестра. Кажется, ключом к успешному соединению является значение пароля в HKCU \ Comm \ EAP \ Config [SSID]. Но поскольку CryptProtectData использует недокументированное значение энтропии (по очевидным причинам безопасности) для шифрования пароля, представляется невозможным воссоздать действительную запись в реестре программным путем.

Затем я выбрал второе лучшее решение, после вызова WZCSetInterface, перехватив диалоговое окно «Вход в систему» ​​и введя в него необходимые поля:

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;                                
  }
}

Обратите внимание, что я только устанавливаю поле пароля, потому что поля имени пользователя и домена предварительно заполнены информацией, уже сохраненной в реестре (значение Identity, упомянутое в моем исходном вопросе).

Это работает достаточно хорошо, поскольку создает соединение WLAN с использованием учетных данных PEAP. А если переместить диалоговое окно «Вход в систему» ​​за пределы экрана, как только оно будет найдено, все это незаметно для пользователя нашего приложения (наше приложение работает в режиме киоска).

0 голосов
/ 14 января 2011

Диалог входа пользователя, вероятно, является подсказкой из-за ключей, основанных на

HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\.

Ключи "InvokePasswordDialog" и "InvokeUserNameDialog" имеют значение 1.

Попробуйте переключить их на 0.

0 голосов
/ 25 февраля 2010

Мы получили положительный опыт работы с проектом wpa_supplicant под Windows CE 5.0 и 6.0. Я не знаю, работает ли он под WM, но, полагаю, работает.

Интеграция в нашем приложении потребовала некоторых усилий (то есть создание службы вокруг ядра wpa_supplicant, отключение драйвера Zero Configuration). Однако оно того стоило: наше приложение полностью контролирует весь процесс конфигурирования / объединения.

0 голосов
/ 21 января 2010

Не знаю, поможет ли это вам или нет, но у меня была та же проблема, и я продолжал добавлять записи в реестр, пока что-то не исправило. Я не уверен, что из этих исправлений, но вот записи, которые я использую (отредактированные, чтобы скрыть информацию, связанную с безопасностью):

Редактор реестра Windows, версия 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]
...