我已经在这方面工作了几天,这是我的头脑:
我们的应用程序使用.NET Compact Framework 2.0构建,并在Windows Mobile 5& 6个设备。 我们可以使用Wireless Zero Config功能(在此描述:msdn.microsoft.com/en-us/library/ms894771.aspx)以编程方式设置设备的WLAN连接,最值得注意的是我们从应用程序中提取的WZCSetInterface功能。这适用于WEP和WPA-PSK连接。
在最近添加对WPA2网络的支持的努力中,我们决定修改代码。我们已经成功添加了对WPA2的支持,WPA2通过在调用WZCSetInterface之前设置正确的注册表设置来使用802.1x身份验证证书。 现在我们想要使用PEAP(MS-CHAPv2)身份验证为WPA2做同样的事情。在Windows Mobile中手动创建此类连接时,将提示用户输入域/用户/密码详细信息。在我们的应用程序中,我们将在本地存储这些详细信息,并希望以编程方式执行此操作而无需任何用户干预。
所以我想与证书身份验证一样,在调用WZCSetInterface之前设置正确的注册表项。
我们设置的注册表设置是: \ HKCU \ Comm \ EAP \ Config \ [ssid name]
但是当设置了这些设置并且我使用正确的参数调用WZCSetInterface时,它仍然会提示我使用“用户登录”对话框询问域/用户名/密码。
有没有人知道我需要做些什么来阻止密码对话框出现并立即与注册表中存储的设置连接?
答案 0 :(得分: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;
}
}
请注意,我只设置了密码字段,因为用户名和域字段预先填充了已存储在注册表中的信息(我原始问题中提到的标识值)。
这很好用,因为它使用PEAP凭据创建WLAN连接。通过在发现用户登录对话框后立即将其移出屏幕,这一切都无形地发生在我们的应用程序用户身上(我们的应用程序以自助服务终端模式运行)。
答案 1 :(得分: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]
答案 2 :(得分:0)
我们在Windows CE 5.0和6.0下的wpa_supplicant项目中积累了丰富的经验。我不知道它是否在WM下工作但我认为确实如此。
我们的应用程序中的集成需要一些努力(即围绕wpa_supplicant核心创建服务,禁用零配置驱动程序)。但是,值得付出努力:我们的应用程序可以完全控制整个配置/关联过程。
答案 3 :(得分:0)
由于基于
的密钥,用户登录对话框可能会提示HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\.
键“InvokePasswordDialog”和“InvokeUserNameDialog”的值为1.
尝试将它们切换为0.