// C++ 版 モジュールのサンプル
//----------------------------------------------------------------------------------
// ■ 次のように設定します
// ログオン時:cpp-module.exe %s
// ロック時: cpp-module.exe %s %u %d
#include <windows.h>
#include <stdio.h>
#include "resource.h"
#define BUF_SIZE 256
// ロック時のユーザー名
wchar_t* gpszLockUsername = NULL;
// ロック時のドメイン
wchar_t* gpszLockDomain = NULL;
// ダイアログプロシージャ
BOOL CALLBACK DialogProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch(uiMsg)
{
case WM_INITDIALOG:
{
// ロック時にはユーザー名を設定して編集できなくする
if(gpszLockUsername)
{
SetDlgItemTextW(hDlg, IDC_USERNAME, gpszLockUsername);
SetDlgItemTextW(hDlg, IDC_DOMAIN, gpszLockDomain);
SendMessage(GetDlgItem(hDlg, IDC_USERNAME), EM_SETREADONLY, TRUE, 0);
SendMessage(GetDlgItem(hDlg, IDC_DOMAIN), EM_SETREADONLY, TRUE, 0);
SetFocus(GetDlgItem(hDlg, IDC_PASSWORD));
}
return FALSE;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
{
char pszUsername[BUF_SIZE], pszDomain[BUF_SIZE], pszPassword[BUF_SIZE];
GetDlgItemText(hDlg, IDC_USERNAME, pszUsername, BUF_SIZE);
GetDlgItemText(hDlg, IDC_DOMAIN, pszDomain, BUF_SIZE);
GetDlgItemText(hDlg, IDC_PASSWORD, pszPassword, BUF_SIZE);
HANDLE hToken = NULL;
BOOL fSuccess = LogonUser(pszUsername, pszDomain, pszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken);
DWORD dwError = GetLastError();
if(fSuccess || dwError == ERROR_PASSWORD_EXPIRED || dwError == ERROR_PASSWORD_MUST_CHANGE)
{
// ログオン成功、または、パスワード変更の必要あり
if(hToken != NULL)
{
CloseHandle(hToken);
}
char pszOutput[BUF_SIZE * 3 + 100];
wsprintf(pszOutput, "MsUsername=%s\nMsDomain=%s\nMsPassword=%s\nAction=logon\n", pszUsername, pszDomain, pszPassword);
puts(pszOutput);
#if defined(_DEBUG) || defined(DEBUG)
MessageBox(hDlg, pszOutput, "デバッグ情報", MB_OK);
#endif
EndDialog(hDlg, TRUE);
}
else
{
// ログオン失敗
char* pszBuf = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
LANG_USER_DEFAULT, (LPTSTR)&pszBuf, 0, NULL);
MessageBox(hDlg, pszBuf, "エラーが発生しました", MB_OK);
LocalFree(pszBuf);
}
return TRUE;
}
case IDCANCEL:
EndDialog(hDlg, NULL);
printf("Action=cancel\n");
return TRUE;
}
return FALSE;
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPSTR lpCmdLine, int intShowCmd)
{
// コマンドライン引数を取得
int argc;
wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
// 1つ目の引数が 'lock' のときは、その後に続くユーザー名・ドメイン名を取得
if(argc > 1 && wcscmp(argv[1], L"lock") == 0)
{
if(argc > 2)
{
gpszLockUsername = argv[2];
if(argc > 3)
{
gpszLockDomain = argv[3];
}
}
else
{
// ユーザー名の取得に失敗
MessageBox(NULL, "ロック時にはユーザー名を指定しなければなりません", "エラー", MB_ICONERROR);
return 1;
}
}
DialogBox(hInstance, MAKEINTRESOURCE(IDD_LOGON), NULL, (DLGPROC)DialogProc);
return 0;
}