1

我正在使用 c++ win32 API。

我尝试使用 GetUserNameExA(); 获取用户详细信息;

我已将此功能用于系统登录对话框源(GINA)。在我的日志文件中,它给出了

CN=ComputerName,CN=Computers,DC=JEGAN,DC=COM".

但它是在登录系统后使用的,当时它会像"CN=sanju,CN=USERS,DC=JEGAN,DC=COM"我的其他解决方案一样提供用户详细信息。

我只想要用户详细信息,但它在登录时提供系统详细信息,我如何在登录时获取用户详细信息?

注意:我已经尝试过ADSI、LDAP功能和目录服务无法使用。所以建议任何其他系统功能。

4

2 回答 2

5

David 是正确的 - GINA DLL 是由 WinLogon.exe 进程加载的。检查任务管理器,您会看到 WinLogon.exe 作为本地系统运行。GetUserNameGetUserNameEx函数提供有关当前线程身份的信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435.aspx

从 20,000 英尺的角度来看,在验证用户凭据后,GINA 会通知所有网络提供商登录成功。在此之后,它会加载用户的配置文件并创建用户的外壳 (Explorer.exe),然后显示该外壳。

您可以尝试改用网络提供商。它们通过 Windows 8 得到完全支持,并且可以为系统定义多个 NP,因此您不会遇到 GINA 所具有的“链接”问题。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa378775.aspx

NPLogonNotify函数将接收用户的明文名称、域和密码(有时您会收到一个 UPN 作为用户名,在这种情况下域为空)。您可以按原样使用此信息,对 AD 执行基于 LDAP 的查找或在调用之前使用LogonUser& 。由于网络提供商在 WinLogon.exe 进程中作为本地系统运行,因此对最后一种方法要格外小心。 始终调用并撤消/清理以前的调用。ImpersonateLoggedOnUserGetUserNameExRevertToSelfCloseHandle

于 2012-11-19T19:27:09.960 回答
0

您尝试做的唯一(非常古怪的)解决方法是登录可以访问域的其他用户帐户,从而可以查询用户详细信息(虽然不记得详细所需的权限) . 否则,我建议您使用 Gregg 的答案。

使用模拟为此类用户的线程,您应该能够通过和朋友查询您将要登录的用户的信息(到那时您怎么知道?)NetUserGetInfo()。选择USER_INFO_* struct最适合您需求的,只需向域服务器询问信息即可。这也应该适用于早期和后期的系统(功能,而不是 GINA 本身)。

于 2012-11-19T19:36:13.703 回答