2010-08-09 176 views
4

如何使用Windows API或其他方式获取登录用户的全名(他/她输入的真实姓名)?例如,如何获得“约翰史密斯”,而不是“约翰”(因为它是他的用户名)。如何在Windows中获取登录用户的全名?

GetUserName(...)不做这项工作,因为它返回用户名,而不是全名。

+0

在这里回答:http://stackoverflow.com/questions/3686201/how-do-you-read-the-users-display-first-and-last-name-on -all-versions-of-wind/7826177#7826177 – 2011-10-19 18:30:48

+0

如果您不在域上,此问题的接受答案不起作用。请参阅此问题的解决方法:http://stackoverflow.com/questions/3686201/how-do-you-read-the-users-display-first-and-last-name-on-all-versions-of-wind – 2012-07-24 13:35:05

回答

4

你试过GetUserNameEx(NameDisplay,...)?

+0

我设法使用该功能获取用户的全名!谢谢。不知何故,当我第一次看到这个问题时,我没有找到GetUserNameEx(..)。 如果GetUserNameEx(..)因任何原因失败,我确实建立了一个备份系统来查看用户的名字或电子邮件从Windows注册表。 – Termopetteri 2010-08-10 04:51:00

+0

@Termopetteri:如果用户没有指定全名,那么GetUserNameEx将会失败,并返回ERROR_NOT_MAPPED,在这种情况下,只需使用非Ex版本。 – Anders 2010-08-11 13:16:30

+0

它看起来有GetUserNameEx(NameDisplay)中的错误,它不起作用,当你不在一个域。 – 2010-09-10 16:31:20

0

那么,如果用户从来没有输入过它,那么你就无法获得它。您可以查找已安装的电子邮件程序并礼貌地询问他们的信息,但出于很多原因,这是一个糟糕的主意。

这是您的最佳拍摄:获取用户在注册Windows副本时输入的名称。这是在注册表中。 Windows版本的确切位置不同,但在最近的版本中,它位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion(以及Windows 95/98/ME,位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion)。

在那里,你会发现RegisteredOwner,这是应该输入名称的地方。显然,如果这是一台公司电脑,并且该机器是由IT部门设立的,那么在那里找到一个标准化的公司字符串是很常见的。当然,很多人会像“Joe Sixpack”或“Quartex Cracked”那样输入名字。然而,这是尽可能接近你可以得到的。

+0

这次真是万分感谢。我正在公司环境中开发,所以RegisteredOwner被设置为“IT管理”。 – Termopetteri 2010-08-09 10:06:57

3

快速谷歌显示,NetUserGetInfo应该这样做。它看起来不像世界上最容易使用的API。

我认为你以后的水平是10,它返回一个USER_INFO_10结构,其中包含usri10_full_name等等。

确保您记得在完成时释放结构,使用NetApiBufferFree

+0

如果您处于网络环境中,这很有用......但问题也可能是关于单个工作站。 – EboMike 2010-08-09 09:27:58

+0

“Net”API只是安全帐户管理器(SAM)API的包装,它们不仅用于网络相关用途。大多数人都希望在本地SAM数据库上运行。 – wj32 2010-08-09 09:31:36

+0

我无法使用NetUserGetInfo,因为它需要用户名作为其参数。 NetUserGetInfo在向我提供用户名时返回NERR_UserNotFound。 – Termopetteri 2010-08-09 10:20:23

0

我发现在Windows注册表中的某些地方与我的电子邮件或我的全名:

  1. HKEY_CURRENT_USER \软件\微软\办公室\ COMMON \的UserInfo用户名其中包含我的全名。
  2. KEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer已有登录用户名其中包含我的电子邮件。
  3. HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon has DefaultUserName其中包含我的电子邮件。

第一个显然需要安装Microsoft Office,并且用户在Office设置中输入了他/她的名字。第二个和第三个更可靠,但包含电子邮件,但电子邮件也是好的(或更好的)标识比全名。

0

我相信我发现了一个相关的答案,它比单独使用GetUserNameEx更好,也就是说,我可以处理GetUserNameEx失败的一些情况。

我的替代答案是here,包括Delphi的示例代码。总之,如果GetUserInfoEx(3,...)失败,请阅读以“machinename \ username”形式返回名称的GetUserInfoEx(2,...),然后您可以将它传递到NETAPI32中的NetUserInfo函数中.dll,它将读取本地SAM数据库,该数据库是存储用户全名的地方,如果它们已将其设置在本地SAM数据库中。当然,许多家庭非域用户从来没有设置过,所以这里的其他答案也可能提供一些提示。

0

NetQueryDisplayInformation应该有所帮助。 该字段usri1_full_name将给出全名

相关问题