[戻る]

cpp-simple.cpp

Credential Provider Extender のサンプル "cpp-simple" のソースコードです。

パッケージ中の C:\cpe\module\source\cpp-simple\cpp-simple.cpp にあります。

  1.  
  2. // C++ 版 モジュールのサンプル
  3. //----------------------------------------------------------------------------------
  4. // ■ 次のように設定します
  5. //   ログオン時:cpp-module.exe %s
  6. //   ロック時:  cpp-module.exe %s %u %d
  7.  
  8. #include  <windows.h>
  9. #include  <stdio.h>
  10. #include  "resource.h"
  11. #define   BUF_SIZE  256
  12.  
  13. // ロック時のユーザー名
  14. wchar_t* gpszLockUsername = NULL;
  15. // ロック時のドメイン
  16. wchar_t* gpszLockDomain = NULL;
  17.  
  18. // ダイアログプロシージャ
  19. BOOL CALLBACK DialogProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
  20. {
  21.     switch(uiMsg)
  22.     {
  23.         case WM_INITDIALOG:
  24.         {
  25.             // ロック時にはユーザー名を設定して編集できなくする
  26.             if(gpszLockUsername)
  27.             {
  28.                 SetDlgItemTextW(hDlg, IDC_USERNAME, gpszLockUsername);
  29.                 SetDlgItemTextW(hDlg, IDC_DOMAIN, gpszLockDomain);
  30.                 SendMessage(GetDlgItem(hDlg, IDC_USERNAME), EM_SETREADONLY, TRUE, 0);
  31.                 SendMessage(GetDlgItem(hDlg, IDC_DOMAIN), EM_SETREADONLY, TRUE, 0);
  32.                 SetFocus(GetDlgItem(hDlg, IDC_PASSWORD));
  33.             }
  34.  
  35.             return FALSE;
  36.         }
  37.  
  38.         case WM_COMMAND:
  39.             switch(LOWORD(wParam))
  40.             {
  41.                 case IDOK:
  42.                 {
  43.                     char pszUsername[BUF_SIZE], pszDomain[BUF_SIZE], pszPassword[BUF_SIZE];
  44.                     GetDlgItemText(hDlg, IDC_USERNAME, pszUsername, BUF_SIZE);
  45.                     GetDlgItemText(hDlg, IDC_DOMAIN, pszDomain, BUF_SIZE);
  46.                     GetDlgItemText(hDlg, IDC_PASSWORD, pszPassword, BUF_SIZE);
  47.                    
  48.                     HANDLE hToken = NULL;
  49.                     BOOL fSuccess = LogonUser(pszUsername, pszDomain, pszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken);
  50.                     DWORD dwError = GetLastError();
  51.                     if(fSuccess || dwError == ERROR_PASSWORD_EXPIRED || dwError == ERROR_PASSWORD_MUST_CHANGE)
  52.                     {
  53.                         // ログオン成功、または、パスワード変更の必要あり
  54.                         if(hToken != NULL)
  55.                         {
  56.                             CloseHandle(hToken);
  57.                         }
  58.  
  59.                         char pszOutput[BUF_SIZE * 3 + 100];
  60.                         wsprintf(pszOutput, "MsUsername=%s\nMsDomain=%s\nMsPassword=%s\nAction=logon\n", pszUsername, pszDomain, pszPassword);
  61.                         puts(pszOutput);
  62. #if defined(_DEBUG) || defined(DEBUG)
  63.                         MessageBox(hDlg, pszOutput, "デバッグ情報", MB_OK);
  64. #endif
  65.                         EndDialog(hDlg, TRUE);
  66.                     }
  67.                     else
  68.                     {
  69.                         // ログオン失敗
  70.                         char* pszBuf = NULL;
  71.                         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
  72.                             LANG_USER_DEFAULT, (LPTSTR)&pszBuf, 0, NULL);
  73.                         MessageBox(hDlg, pszBuf, "エラーが発生しました", MB_OK);
  74.                         LocalFree(pszBuf);
  75.                     }
  76.                     return TRUE;
  77.                 }
  78.  
  79.                 case IDCANCEL:
  80.                     EndDialog(hDlg, NULL);
  81.                     printf("Action=cancel\n");
  82.                     return TRUE;
  83.             }
  84.             return FALSE;
  85.     }
  86.  
  87.     return FALSE;
  88. }
  89.  
  90.  
  91. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPSTR lpCmdLine, int intShowCmd)
  92. {
  93.     // コマンドライン引数を取得
  94.     int argc;
  95.     wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
  96.  
  97.     // 1つ目の引数が 'lock' のときは、その後に続くユーザー名・ドメイン名を取得
  98.     if(argc > 1 && wcscmp(argv[1], L"lock") == 0)
  99.     {
  100.         if(argc > 2)
  101.         {
  102.             gpszLockUsername = argv[2];
  103.  
  104.             if(argc > 3)
  105.             {
  106.                 gpszLockDomain = argv[3];
  107.             }
  108.         }
  109.         else
  110.         {
  111.             // ユーザー名の取得に失敗
  112.             MessageBox(NULL, "ロック時にはユーザー名を指定しなければなりません", "エラー", MB_ICONERROR);
  113.             return 1;
  114.         }
  115.     }
  116.  
  117.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_LOGON), NULL, (DLGPROC)DialogProc);
  118.     return 0;
  119. }