c++ - 如何判断登录的windows账号是否已经在域上认证

标签 c++ windows authentication active-directory single-sign-on

<分区>

Possible Duplicate:
Authenticating users using Active Directory in Client-Server Application

我正在使用非托管 C++ 在我的程序中尝试单点登录方法,并且需要确定当前 Windows 用户是否在我的域中经过身份验证。如果我能找到一种方法知道用户已通过身份验证,我将允许他进入我的桌面应用程序而不需要密码(用户名在我的应用程序和域中是相同的)。

我可以使用 ADsOpenObject() 直接针对 Active Directory 进行身份验证,但这需要用户名、密码和权限,我只需要使用用户名即可,无需用户本人输入。

有了 .net,我可以使用 System.DirectoryServices 中的一些东西,比如在 this 线程中。

据我所知,此任务可能涉及分析 Windows 安全 kerberos token 以正确执行。这在 this 线程中进行了彻底讨论,并在 this 线程中针对 Java 进行了触及。尽管我不需要严格的 SSO,因为我的应用程序不会尝试访问与域相关的任何内容。

SSPI 票据方式是唯一的方式吗?还是我可以利用 ADSI/WinLogon/CredentialsCache 的某些属性使其工作?

最佳答案

这是一种非常简单的方法,但是如果您检查用户的环境变量:

在工作组上:

COMPUTERNAME=JPBHPP2
LOGONSERVER=\\JPBHPP2
USERDOMAIN=JPBHPP2

在域上

COMPUTERNAME=WM2008R2ENT
LOGONSERVER=\\WM2008R2ENT
USERDNSDOMAIN=DOM.FR
USERDOMAIN=DOM

这里不是很明显,因为用户已登录到服务器,但 USERDOMAINCOMPUTERNAME

不同

还有GetUserNameEx可以完成这项工作的API

BOOLEAN WINAPI GetUserNameEx(
  __in     EXTENDED_NAME_FORMAT NameFormat,
  __out    LPTSTR lpNameBuffer,
  __inout  PULONG lpnSize
);

关于c++ - 如何判断登录的windows账号是否已经在域上认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7663439/

相关文章:

windows - 批量合并单个制表符分隔文件中的 2 个 txt 文件

c++ - CRichEditCtrl 在使用 MFC 编写的共享 dll 中无法正常工作?

PHP 如果逻辑被跳过?

authentication - 向静态 Azure 网站添加身份验证

hadoop - 具有相同 kerberos 领域的两个集群

c++ - 故障排除替换 C++

c++ - 读取(简单)程序集以查找使用 C++ 模板产生的编译时计算

c++ - 在 UDP 套接字上多次调用 connect() 以发送到不同的目标地址 - 有效吗?

c++返回函数类型通过nlohmann json.hpp返回json数组

c++ - 对 Cocos2d-x 大小类型的引用不明确