2

我已经为此工作了几天,这让我很头疼:

我们的应用程序使用 .NET Compact Framework 2.0 构建并在 Windows Mobile 5 和 6 设备上运行。我们可以使用无线零配置函数(在此处描述:msdn.microsoft.com/en-us/library/ms894771.aspx)以编程方式设置设备的 WLAN 连接,最值得注意的是我们从应用程序中调用的 WZCSetInterface 函数。这适用于 WEP 和 WPA-PSK 连接。

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

所以我想沿着与证书认证相同的路线,在调用 WZCSetInterface 之前设置正确的注册表项。

我们设置的注册表设置是:\HKCU\Comm\EAP\Config\[ssid name]

  • Enable8021x = 1 (DWORD)
  • LastAuthSuccessful = 1 (DWORD)
  • EapTypeId = 25 (DWORD)
  • 身份 =“域\用户名”(字符串)
  • 密码 = 包含使用
    CryptProtectData 函数加密的密码的二进制 blob(在此处描述:msdn.microsoft.com/en-us/library/ms938309.aspx)

但是,当设置了这些设置并且我使用正确的参数调用 WZCSetInterface 时,它​​仍然提示我使用“用户登录”对话框询问域/用户名/密码。

有没有人知道我需要做什么来防止密码对话框出现并立即与存储在注册表中的设置连接?

4

4 回答 4

1

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

这很好用,因为它使用 PEAP 凭据创建 WLAN 连接。通过在找到用户登录对话框后立即将其移出屏幕,这一切对我们应用程序的用户来说都是不可见的(我们的应用程序在 kiosk 模式下运行)。

于 2010-02-25T10:56:57.900 回答
0

用户登录对话框可能会提示,因为键基于

HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\.

“InvokePasswordDialog”和“InvokeUserNameDialog”键的值为 1。

尝试将它们切换为 0。

于 2011-01-14T13:49:11.723 回答
0

我不知道这是否会对您有所帮助,但我遇到了同样的问题并不断添加注册表项,直到修复它为止。我不确定其中哪些修复了它,但这是我正在使用的条目(编辑以隐藏安全相关信息):

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]
于 2010-01-21T18:22:36.170 回答
0

我们在 Windows CE 5.0 和 6.0 下使用wpa_supplicant项目取得了积极的经验。我不知道它是否可以在 WM 下工作,但我想可以。

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

于 2010-02-25T11:25:11.720 回答