平台:Windows 10 x64 开发环境:MSVC 2017
Active Directory 平台:Windows Server 2016(评估)
我正在尝试验证位于使用 Windows Active Directory 维护的远程服务器上的 Windows 用户。我在本地 PC 上运行的服务给出了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;
}
我哪里错了?
我决定自己尝试一下。事实证明,解决方案很简单。您的用户名不应包含域名。所以改变这个:
string_type userName = TEXT("darksorrow\\ds");
对此:
string_type userName = TEXT("ds");
您已经将域指定为单独的参数,因此不需要将其作为用户名的一部分。
您应该仍然可以使用LDAP_AUTH_NEGOTIATE
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句