验证域用户凭据 我需要一种方法来验证Windows上的本地C++用户/密码对。 输入用户和密码,用户可以是域\用户格式

验证域用户凭据 我需要一种方法来验证Windows上的本地C++用户/密码对。 输入用户和密码,用户可以是域\用户格式,c++,windows,authentication,active-directory,C++,Windows,Authentication,Active Directory,基本上,我需要编写一个函数: 如果用户/密码是有效的本地帐户,则返回true。(第一部分) 如果用户/密码在给定域上有效,也返回true。(第二部分) 否则返回false 使用I solved(第1部分)(但我还必须检查用户名是否为有效用户,因为对于密码为空的用户,它会失败-这是一个难看的解决方法,但它可以工作) 但是,对于“.”之外的任何域,上述KB示例代码对任何用户/过程对都有效(错误) 我尝试过使用ldap绑定,但对于不正确的用户/传递对(可怕的来宾帐户?)它成功了。另外,对于“.”域,在

基本上,我需要编写一个函数: 如果用户/密码是有效的本地帐户,则返回true。(第一部分) 如果用户/密码在给定域上有效,也返回true。(第二部分) 否则返回false

使用I solved(第1部分)(但我还必须检查用户名是否为有效用户,因为对于密码为空的用户,它会失败-这是一个难看的解决方法,但它可以工作)

但是,对于“.”之外的任何域,上述KB示例代码对任何用户/过程对都有效(错误)

我尝试过使用ldap绑定,但对于不正确的用户/传递对(可怕的来宾帐户?)它成功了。另外,对于“.”域,在LDAP\u服务器\u关闭的情况下,它无法获取有效的用户/密码(可能是因为本地主机不是域控制器?)

也许我对其中一些概念不太清楚。我希望至少我的问题能解释清楚。 我不依赖任何方法,如日志那样,它只能在C++本地代码中实现。 这个问题似乎已经解决了(除非没有公认的答案)。唉,这是C#


编辑:来吧,堆栈溢出,你从来没有让我失望过…

一个古老的代码和平,我无法测试,所以给出如下:

//---------------------------------------------------------
// quick ADSI sample - binding to a user 
//---------------------------------------------------------

//---------------------------------------------------------
// should use unicode - saves a lot of conversion work
//---------------------------------------------------------
#define _UNICODE

//---------------------------------------------------------
// libraries needed to use ADSI
//---------------------------------------------------------
#pragma comment( lib, "Activeds.lib" )
#pragma comment( lib, "Adsiid.lib" )

//---------------------------------------------------------
// ADSI header
//---------------------------------------------------------
#include <activeds.h>

int wmain( int argc, wchar_t *argv[] )
{
  //-----------------------------------------------------
  // HRESULT hr is the return code value from all ADSI
  // calls - using the SUCCEEDED MACRO to check for 
  // success
  //-----------------------------------------------------
  HRESULT hr;

  //-----------------------------------------------------
  // pointer to our IADsUser object
  //-----------------------------------------------------
  IADsUser *pUser = NULL;

  //-----------------------------------------------------
  // path to the user we are going to try to update
  // make sure you replace this with something
  // specific to your environment
  // Form : WinNT://<domain name>/<object name>,<object class>
  //-----------------------------------------------------
  LPWSTR pszADsPath = L"WinNT://yourdomain/object name,user";
  // 
  // See available forms :
  // http://msdn.microsoft.com/en-us/library/aa746534(v=VS.85).aspx

  //-----------------------------------------------------
  // intialize the COM subsystem before doing any work
  //-----------------------------------------------------
  CoInitialize(NULL);

  //-----------------------------------------------------
  // try to get the user
  // http://msdn.microsoft.com/en-us/library/aa772184(v=VS.85).aspx
  //-----------------------------------------------------
  hr = ADsGetObject(pszADsPath, IID_IADsUser,(void**)&pUser);

  // Here Test hr
  //http://msdn.microsoft.com/en-us/library/aa772195(v=VS.85).aspx

  //-----------------------------------------------------
  // kill the COM subsystem we were using
  //-----------------------------------------------------
  CoUninitialize();

  return 0;
}
//---------------------------------------------------------
//快速ADSI示例-绑定到用户
//---------------------------------------------------------
//---------------------------------------------------------
//应使用unicode-节省大量转换工作
//---------------------------------------------------------
#定义UNICODE
//---------------------------------------------------------
//需要使用ADSI的库
//---------------------------------------------------------
#pragma注释(lib,“Activeds.lib”)
#pragma注释(lib,“Adsiid.lib”)
//---------------------------------------------------------
//ADSI头
//---------------------------------------------------------
#包括
int wmain(int argc,wchar_t*argv[])
{
//-----------------------------------------------------
//HRESULT hr是所有ADSI的返回代码值
//调用-使用成功的宏检查
//成功
//-----------------------------------------------------
HRESULT-hr;
//-----------------------------------------------------
//指向IADsUser对象的指针
//-----------------------------------------------------
IADsUser*pUser=NULL;
//-----------------------------------------------------
//我们要尝试更新的用户的路径
//一定要用什么东西替换这个
//特定于您的环境
//表格:WinNT://,
//-----------------------------------------------------
LPWSTR pszADsPath=L“WinNT://yourdomain/object name,user”;
// 
//请参阅可用表格:
// http://msdn.microsoft.com/en-us/library/aa746534(v=VS.85).aspx
//-----------------------------------------------------
//在执行任何工作之前初始化COM子系统
//-----------------------------------------------------
共初始化(空);
//-----------------------------------------------------
//尝试获取用户
// http://msdn.microsoft.com/en-us/library/aa772184(v=VS.85).aspx
//-----------------------------------------------------
hr=ADsGetObject(pszADsPath,IID_IADsUser,(void**)和pUser);
//这里是测试人力资源
//http://msdn.microsoft.com/en-us/library/aa772195(v=VS.85).aspx
//-----------------------------------------------------
//杀死我们正在使用的COM子系统
//-----------------------------------------------------
coninitialize();
返回0;
}
如果您指的是“.”域,即不受“信任”的域,而运行代码的域失败了,那么这就是设计


几年前,当我们使用支持票证时,Microsoft对此的最佳答案是使用WNetUseConnection()。

我认为这是最接近的答案。我发现在一台加入域的PC上,我的代码工作正常。在测试PC(通过VPN连接到与域控制器相同的LAN)上,代码失败。