代码之家  ›  专栏  ›  技术社区  ›  Tom van Enckevort

在Windows Mobile中以编程方式设置PEAP连接

  •  2
  • Tom van Enckevort  · 技术社区  · 15 年前

    我已经在这方面工作了几天,这是我的头绪:

    我们的应用程序是使用.NET Compact Framework 2.0构建的,运行在Windows Mobile 5&6个设备。 我们可以使用Wireless Zero Config函数(此处描述:msdn.microsoft.com/en us/library/ms894771.aspx)以编程方式设置设备的WLAN连接,最显著的是我们从应用程序中pinvoke的WZCSetInterface函数。这适用于WEP和WPA-PSK连接。

    在最近添加对WPA2网络支持的努力中,我们决定修改代码。我们已经成功地添加了对WPA2的支持,它通过在调用WZCSetInterface之前设置正确的注册表设置,为802.1x身份验证使用证书。 现在,我们希望使用PEAP(MS-CHAPv2)身份验证对WPA2执行同样的操作。在Windows Mobile中手动创建此类连接时,将提示用户输入域/用户/密码详细信息。在我们的应用程序中,我们将把这些细节存储在本地,并希望以编程方式完成这一切,而无需任何用户干预。

    因此,我认为应该遵循与证书身份验证相同的路线,在调用WZCSetInterface之前设置正确的注册表项。

    我们设置的注册表设置为:

    • Enable8021x=1(DWORD)
    • LastAuthSuccessful=1(DWORD)
    • EapTypeId=25(DWORD)
    • Password=包含使用

    有人知道我需要做什么来阻止出现密码对话框并直接连接到注册表中存储的设置吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Tom van Enckevort    14 年前

    经过更多的调查,我最终放弃了注册表设置。成功连接的关键似乎是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;                                
      }
    }
    

    请注意,我只设置密码字段,因为用户名和域字段预先填充了已存储在注册表中的信息(我最初的问题中提到的标识值)。

    这可以很好地工作,因为它使用PEAP凭据创建WLAN连接。一旦找到用户登录对话框,就将其移到屏幕外,这一切都会发生在应用程序的用户身上(我们的应用程序运行在kiosk模式下)。

        2
  •  0
  •   Christian Schwarz    14 年前

    我们在这方面取得了积极的经验 wpa_supplicant

    我们的应用程序中的集成需要一些努力(即围绕wpa_请求者核心创建服务,禁用零配置驱动程序)。然而,这是值得的:我们的应用程序可以完全控制整个配置/关联过程。

        3
  •  0
  •   sra Jon    13 年前

    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]
    
        4
  •  0
  •   mbinette    12 年前

    “用户登录”对话框可能是提示性的,因为基于中的键

    HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\.
    

    尝试将它们切换到0。