Платформа: Windows 10 x64
Среда разработки: MSVC 2017
Платформа Active Directory: Windows Server 2016 (оценка)
Я пытаюсь аутентифицировать пользователей Windows, расположенных на удаленном сервере, поддерживаемых с помощью Windows Active Directory. Моя служба, работающая на локальном ПК, выдает сообщение об ошибке Invalid Credentials (даже после передачи правильного аутентифицированного имени пользователя, пароля и домена).
#include "pch.h"
#include <iostream>
#include <Windows.h>
#include <Winldap.h>
#include <plog/Log.h>
#include <string>
#ifdef UNICODE
typedef std::wstring string_type;
#define CONSOLE_OUT std::wcout
#define CONSOLE_IN std::wcin
#define CONSOLE_ERR std::wcerr
#else
typedef std::string string_type;
#define CONSOLE_OUT std::cout
#define CONSOLE_IN std::cin
#define CONSOLE_ERR std::cerr
#endif
int main()
{
SEC_WINNT_AUTH_IDENTITY sec;
string_type hostName = TEXT("192.168.1.49");
string_type domain = TEXT("WIN-49MT1TDDGOC.darksorrow.com");
string_type userName = TEXT("darksorrow\\ds");
string_type password = TEXT("darksorrow@1234567890");
PLDAP ld = nullptr;
int ldapReturnCode;
CONSOLE_OUT << TEXT("Hello World!\n");
plog::init(plog::error, "error.dat", 1048576, 3); //1 M.B.
ld = ldap_init(const_cast<PWSTR>(hostName.c_str()), LDAP_PORT);
if (ld == nullptr)
{
LOG_ERROR << ldap_err2string(LdapGetLastError());
CONSOLE_OUT << ldap_err2string(LdapGetLastError());
}
const int version = LDAP_VERSION3;
ldapReturnCode = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, std::addressof(version));
if (ldapReturnCode not_eq LDAP_SUCCESS)
{
LOG_ERROR << ldap_err2string(ldapReturnCode);
CONSOLE_OUT << ldap_err2string(ldapReturnCode);
}
ldapReturnCode = ldap_connect(ld, NULL);
if (ldapReturnCode not_eq LDAP_SUCCESS)
{
LOG_ERROR << ldap_err2string(ldapReturnCode);
CONSOLE_OUT << ldap_err2string(ldapReturnCode);
}
PWSTR dn = nullptr;
sec.Domain = (unsigned short *) domain.data();
sec.DomainLength = domain.length();
sec.User = (unsigned short *) userName.data();
sec.UserLength = userName.length();
sec.Password = (unsigned short *) password.data();
sec.PasswordLength = password.length();
sec.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
CONSOLE_OUT << domain << std::endl;
CONSOLE_OUT << userName << std::endl;
CONSOLE_OUT << password << std::endl;
ldapReturnCode = ldap_bind_s(ld, dn, (PWCHAR)std::addressof(sec), LDAP_AUTH_NEGOTIATE);
if (ldapReturnCode not_eq LDAP_SUCCESS)
{
LOG_ERROR << ldap_err2string(ldapReturnCode);
CONSOLE_OUT << ldap_err2string(ldapReturnCode);
}
else
CONSOLE_OUT << "Authentication Success\n";
ldap_unbind(ld);
return EXIT_SUCCESS;
}
Куда я иду не так?