2

私はこれに数日間取り組んできました、そしてこれは私の頭をやっています:

このアプリケーションは、.NET Compact Framework 2.0を使用して構築されており、WindowsMo​​bile5および6デバイスで実行されます。Wireless Zero Config関数(ここで説明:msdn.microsoft.com/en-us/library/ms894771.aspx)、特にアプリケーションから呼び出したWZCSetInterface関数を使用して、デバイスのWLAN接続をプログラムで設定できます。これは、WEPおよびWPA-PSK接続で正常に機能します。

WPA2ネットワークのサポートを追加する最近の取り組みで、コードを変更することにしました。WZCSetInterfaceを呼び出す前に正しいレジストリ設定を設定することにより、802.1x認証に証明書を使用するWPA2のサポートを正常に追加しました。ここで、PEAP(MS-CHAPv2)認証を使用してWPA2に対して同じことを行います。Windows Mobileでこのような接続を手動で作成する場合、ユーザーはドメイン/ユーザー/パスワードの詳細を入力するように求められます。私たちのアプリケーションでは、これらの詳細をローカルに保存し、ユーザーの介入なしにすべてプログラムでこれを実行したいと考えています。

そのため、証明書認証と同じルートをたどり、WZCSetInterfaceを呼び出す前に正しいレジストリエントリを設定することを考えました。

設定するレジストリ設定は次のとおりです。\HKCU\ Comm \ EAP \ Config \ [ssid name]

  • Enable8021x = 1(DWORD)
  • LastAuthSuccessful = 1(DWORD)
  • EapTypeId = 25(DWORD)
  • Identity = "domain \ username"(文字列)
  • パスワード=
    CryptProtectData関数を使用して暗号化されたパスワードを含むバイナリブロブ(ここで説明: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;                                
  }
}

ユーザー名とドメインのフィールドには、レジストリにすでに保存されている情報(元の質問で言及したID値)が事前に入力されているため、パスワードフィールドのみを設定していることに注意してください。

これは、PEAPクレデンシャルを使用してWLAN接続を作成するため、十分に機能します。また、[ユーザーログオン]ダイアログが見つかったらすぐに画面外に移動することで、これはすべてアプリケーションのユーザーには見えないように行われます(アプリはキオスクモードで実行されます)。

于 2010-02-25T10:56:57.900 に答える
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

WindowsCE5.0および6.0でのwpa_supplicantプロジェクトで前向きな経験をしました。WMで動作するかどうかはわかりませんが、動作すると思います。

私たちのアプリケーションへの統合には、いくつかの努力が必要でした(つまり、wpa_supplicantコアの周りにサービスを作成し、Zero Configurationドライバーを無効にします)。ただし、努力する価値はありました。アプリケーションは、構成/関連付けプロセス全体を完全に制御できます。

于 2010-02-25T11:25:11.720 に答える
0

ユーザーログオンダイアログは、に基づいているキーのためにおそらくプロンプトが表示されます

HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\.

キー「InvokePasswordDialog」および「InvokeUserNameDialog」の値は1です。

それらを0に切り替えてみてください。

于 2011-01-14T13:49:11.723 に答える