Стоит такая задача — надо при авторизации юзера подменить введенный домен на другой. Покопав документацию по GINA я пришел к выводу, что это можно сделать в функции WlxLoggedOutSAS.
Проблема заключается в следующем: как получить введенные в диалоговом окне авторизации данные?
И еще вопрос: нужно ли реализовывать всю GINA, а не только ф-ю WlxLoggedOutSAS?
Спасибо.
Здравствуйте, Env0der, Вы писали:
E>Стоит такая задача — надо при авторизации юзера подменить введенный домен на другой. Покопав документацию по GINA я пришел к выводу, что это можно сделать в функции WlxLoggedOutSAS.
E>Проблема заключается в следующем: как получить введенные в диалоговом окне авторизации данные?
E>И еще вопрос: нужно ли реализовывать всю GINA, а не только ф-ю WlxLoggedOutSAS?
E>Спасибо.
На этом сайте есть статья, где в качестве примера описывается gina dll, по сути являющаяся оберткой для msgina. Берем этот пример.
Изображаем такой кусок кода:
BOOL WINAPI WlxInitialize (LPWSTR winstation, HANDLE wlx, PVOID reserved, PVOID winlogonFunctions, PVOID * wlxContext)
{
BOOL r;
winlogon = wlx;
winlogonFuncs = (PWLX_DISPATCH_VERSION_1_0) winlogonFunctions;
realDialogBoxParam = winlogonFuncs->WlxDialogBoxParam;
winlogonFuncs->WlxDialogBoxParam = (PWLX_DIALOG_BOX_PARAM) fakeDialogBoxParam;
return msginaFuncs.wlxInitialize (winstation, wlx, reserved, winlogonFunctions, wlxContext);
}
Теперь у нас msgina вместо WlxDialogBoxParam получит нашу функцию fakeDialogBoxParam(). Вот такую:
INT_PTR WINAPI fakeDialogBoxParam (HANDLE winlogon, HANDLE instance, LPWSTR templ, HWND parent, DLGPROC dlgproc, LPARAM initparam)
{
if (!HIWORD (templ))
{
if (templ == (LPWSTR) IDD_MSGINA_LOGINBOX)
{
realDlgProc = dlgproc;
dlgproc = hookedDlgProc;
}
}
return realDialogBoxParam (winlogon, instance, templ, parent, dlgproc, initparam);
}
Теперь когда msgina попытается создать себе диалог ввода логина, у этого самого диалога будет наша диалоговая процедура hookedDlgProc(). А в ней будет самое интересное:
INT_PTR CALLBACK hookedDlgProc (HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
if ((WM_COMMAND == msg) && (IDOK == LOWORD (wparam)))
{
SetDlgItemTextW (wnd, IDC_MSGINA_USERNAME, userName);
SetDlgItemTextW (wnd, IDC_MSGINA_PASSWORD, userPass);
}
return realDlgProc (wnd, msg, wparam, lparam);
}
В этом примере будет заменяться имя пользователя и пароль. Аналогично можно заменить домен.
IDD_MSGINA_LOGINBOX — идентификатор диалога, IDC_MSGINA_USERNAME, IDC_MSGINA_PASSWORD — идентификаторы контролов на диалоге, смотреть каким-либо распаковщиком ресурсов, например, Resource Hacker.
Идея заимствована из проекта pGina, гуглите его исходники — возможно, поможет.
Удачи.