2009-05-22 22 views
2

私は数日のためにこれに取り組んできましたし、これはで私の頭をやっている:.NET Compact Frameworkの2.0を使用して、およびWindows Mobile 5で実行している私たちのアプリケーションが構築されているプログラムのセットアップのWindows MobileでのPEAP接続

& 6つのデバイス。 Wireless Zero Config関数(ここでは、msdn.microsoft.com/en-us/library/ms894771.aspxを参照)を使用して、デバイスのWLAN接続をプログラムで設定することができます.WZCSetInterface関数を使用することができます。これは、WEPとWPA-PSK接続でうまく動作します。

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

私はWZCSetInterfaceを呼び出す前に、正しいレジストリエントリを設定して、証明書認証と同じルートに進むと考えました。我々が設定

レジストリ設定は、次のとおりです。HKCU \ Commの\ EAP \ Configを\ [SSID名]

  • Enable8021x = 1(DWORD)
  • LastAuthSuccessful = 1(DWORD)
  • EapTypeId \ = 25(DWORD)
  • アイデンティティ= "ドメイン\ユーザー名"(文字列)
  • パスワード=
    クライを使用して暗号化されたパスワードを含むバイナリブロブ

しかし、これらの設定が設定されていて、私が正しいパラメータでWZCSetInterfaceを呼び出しているとき、それはまだユーザーを私に求められます。ptProtectData機能は、(msdn.microsoft.com/en-us/library/ms938309.aspxをここで説明します)ドメイン/ユーザー名/パスワードを要求するログオンダイアログ。

パスワードダイアログが表示されないようにするにはどうすればいいですか?レジストリに保存されている設定にすぐに接続してください。

答えて

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接続を作成するので、十分に機能します。また、ユーザーログオンダイアログを画面の外に移動すると、アプリケーションのユーザーには目に見えなくなります(アプリはキオスクモードで実行されます)。

0

これはあなたに役立つかどうかわかりませんが、私は同じ問題があり、何か修正するまでレジストリエントリを追加し続けました。私はそれを固定これらのかわからないんだけど、ここで私が使用しているエントリ(セキュリティ関連の情報を隠すために編集した)です:

ます。Windows Registry Editor Versionいくつかのより多くの調査の後に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] 
+0

@Ian:時間があれば数週間後にこれを試してみます。 –

+1

@Ian:いくつかの値に入力された情報をどのように生成したか教えてください。たとえば、DPAPIKeysエントリはどのように入手しましたか? –

0

Windows CE 5.0および6.0のwpa_supplicantプロジェクトで肯定的な経験をしました。私はそれがWMの下で動作するかどうかわかりませんが、私はそれがそうすると思います。

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

+0

@Christian:私もそのことを素早く見ていましたが、スピードアップしてソフトウェアに組み込む作業は時間がかかりすぎます。 –

0

ユーザーログオンのダイアログは、おそらくキー「InvokePasswordDialog」と「InvokeUserNameDialogは」値1

は0

にそれらを切り替えるようにしてくださいしているので、

HKEY_LOCAL_MACHINE\Comm\EAP\Extension\25\. 

に基づいて、キーを促しています

+0

私はすでにこれを試していましたが、違いはありません。提案していただきありがとうございます。 –

関連する問題