代码之家  ›  专栏  ›  技术社区  ›  Flash_Steel

是否有任何方法可以让VBA在不使用CMD的情况下从Windows用户帐户获取当前用户的全名?

  •  0
  • Flash_Steel  · 技术社区  · 5 月前

    是否有任何方法可以让VBA在不使用CMD的情况下从Windows用户帐户获取当前用户的全名?

    我有一个团队,他们在Windows机器上协同处理Excel文件。我们在一个域上,但无法使用OneDrive进行协作。

    为了帮助跟踪编辑,我编写了一些VBA,在每次保存时记录时间戳和当前用户(见下文)。

    Environ("Username") 返回他们的Windows 用户名 ,这有点像 ID1234 。我知道所有用户都配置了 全名 喜欢 (公司)闪光钢 与他们的用户帐户相关联。

    全名在记录保存方面更有用。

    我用了a previous answer 在CMD.exe中调用“net user”并解析SDTOUT。这是可行的,但我希望有更优雅的东西,并希望在VBA中原生调用。

    ' When saving, append the user ID and timestamp
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        ...
        Worksheets("Front Cover").Range(nextTimestampCell).Value = Format(Now(), "yy/mm/dd - HH:nn:ss")
        ' Build string for command
        cMDcommand = "cmd /c net user """ & Environ("Username") & """ /DOMAIN | find /I ""Full name"""
        ' Execute command and read top line
        result = Trim(CreateObject("Wscript.Shell").Exec(cMDcommand).StdOut.readline)
        ' Trim result and output User
        Worksheets("Front Cover").Range(nextUserCell).Value = Right(result, Len(result) - 29)
    End Sub
    
    2 回复  |  直到 5 月前
        1
  •  2
  •   BigBen    5 月前

    既然你在Excel中工作,也许可以使用 Application.UserName :

    Worksheets("Front Cover").Range(nextUserCell).Value = Application.UserName
    
        2
  •  2
  •   CHill60    5 月前

    这不适用于您的情况,只是为了完整性而添加。如果您的用户名在Excel中的设置与网络中的设置不同(这种情况会发生,而且Office可以进行个性化设置),并且您绝对需要域中保存的名称,那么此功能将正常工作

    Function GetUserFullName() As String
    ' use the Active Directory user object to get user name
        Dim objNetwork As Object
        Set objNetwork = CreateObject("WScript.Network")
        With objNetwork
            GetUserFullName = GetObject("WinNT://" & .UserDomain & "/" & .UserName & ",user").FullName
        End With
    End Function