【问题标题】:GetUserNameA doesn't retrieve the latest user nameGetUserNameA 不检索最新的用户名
【发布时间】: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


【解决方案1】:

OS Build 18362.356 和 18362.418 在用户帐户管理方面存在一些差异。 (这两个之间有some other versions。我没有测试那些版本。)

在 OS Build 18362.356 上,您可以看到以下 UI 和设置。您可以通过Control Panel\User Accounts\User Accounts -> Manage User Accounts -> Properties 更改用户名。您以管理员身份更改其他帐户用户名或更改您登录的帐户用户名。重启后,您可以使用GetUserName API 或命令set username 获取新用户名。

在 OS Build 18362.418 上,您可以看到以下 UI 和设置。根据您的描述,您似乎正在使用此构建版本并导致此问题。我也可以在此构建版本上重现此问题。

在 OS Build 18362.449 上具有与 18362.356 相同的 UI 和设置,如上所示,我无法在此构建版本上重现此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多