【发布时间】:2019-10-22 05:24:49
【问题描述】:
我有一个使用 windows api 获取当前 windows 用户登录的函数 (https://support.microsoft.com/en-nz/help/152970/visual-basic-procedure-to-get-current-user-name)。
Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
' Main routine to Dimension variables, retrieve user name.
Public Function WindowsUserName() As String
' Dimension variables
Dim lpBuff As String * 25
Dim ret As Long, UserName As String
' Get the user name minus any trailing spaces found in the name.
ret = GetUserName(lpBuff, 25)
WindowsUserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
End Function
问题:如果我重命名了 windows 用户(在 Windows 10 中),即使我使用新名称登录,此功能也总是使用旧名称。
有没有办法在 VBA 中检索最新的用户名?
更新:在少数 cmets 中,控制面板中更改的帐户名称是显示名称,而不是用户名。现在回到我的问题:有没有办法在 VBA 中检索最新的 DISPLAY 名称?
【问题讨论】:
-
为什么要重命名 Windows 用户?...据我了解,在不重新启动操作系统的情况下无法通过这种方式更改登录名。 dll 通常是在编译时编写的,我猜这发生在登录到 windows 之后。
-
可能内存没有更新,访问获取userName。
-
您更改了显示名称而不是系统用户名。我什至不确定您是否可以更改后者。
-
1) 更改用户名后,我重新启动操作系统并使用新名称登录。仍然是旧名称检索。 2)如果以“另一个”用户身份登录,当然可以。但我的方案是重命名现有用户。 3)我使用控制面板\用户帐户\用户帐户\更改您的姓名来更改“帐户名称”,而不仅仅是显示名称。
-
您也可以使用
CreateObject("WScript.Network").UserName。它可能会返回相同的名称,但更短。 :)
标签: vba winapi windows-10