2015-05-18 6 views
0

Я пытаюсь найти простое решение для аутентификации пользователя в Windows. Я бы хотел использовать инфраструктуру MFC для достижения этой цели.Проверка подлинности Windows в VC++

Я гугл об этом и обнаружил, что мне нужно использовать следующую функцию Win32 API:

LogonUser(L"LocalServer", L"NT AUTHORITY", NULL, LOGON32_LOGON_SERVICE, LOGON32_PROVIDER_DEFAULT, &hToken)

Но я не знаю, как заставить его работать. В соответствии с документацией MSDN он возвращает ноль при сбое.

Также при поиске этого я натолкнулся на термин Олицетворение. Было бы здорово, если кто-нибудь сможет это объяснить.

Может кто-нибудь указать на хорошую статью или ресурс для объяснения этой темы. Также было бы здорово увидеть рабочий пример.

Заранее спасибо.

ответ

3

Вот способ проверки учетных данных безопасности пользователя в Windows:

BOOL Logon(const CString& sLogin, const CString& sPassword) 
{ 
    HANDLE hToken = INVALID_HANDLE_VALUE; 

    CString sDomain; 
    CString sUser; 
    int nPos = sLogin.Find(_T("\\")); 
    if (nPos != -1) 
    { 
     sDomain = sLogin.Mid(0, nPos); 
     sUser = sLogin.Mid(nPos + 1, sLogin.GetLength() - nPos - 1); 
    } 

    if (!sDomain.IsEmpty()) 
    { 
     if(!::LogonUser(sUser, sDomain, sPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, &hToken)) 
      return FALSE; 
    } 
    else 
    { 
     if (!::LogonUser(sLogin, _T("."), sPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, &hToken)) 
      return FALSE; 
    } 

    if(!::ImpersonateLoggedOnUser(hToken)) 
     return FALSE; 

    return TRUE; 
} 
+0

решение не работает, всегда возвращает TRUE, даже если я ввожу неправильный логин или пароль. – Yogesh

+0

Это странно. Используете ли вы Windows-домены или нет? –

+0

Да, я использую домен Windows. Для параметра sLogin я передал что-то вроде _T («domain \\ username»). Но он всегда возвращает TRUE. Когда я изменил LOGON32_LOGON_NEW_CREDENTIALS на LOGON32_LOGON_SERVICE, он всегда возвращает FALSE. – Yogesh

Смежные вопросы