2010-08-09 85 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將給出全名

相關問題