使用WMI在VBA中获取当前Windows用户名

时间:2008-11-13 16:15:48

标签: excel excel-vba automation wmi username vba

我想知道是否有一种简单的方法可以使用WMI来获取带有域的当前Windows用户名。 Windows API调用只会获得短用户名,因此您最终会再次调用域名。我有一些代码,但是我遇到了自动化错误。 有任何想法吗?我想我走的是正确的道路,但我对WMI来说还是个新手。

Function GetFullName() As String
    Dim computer As String
    computer = "."
    Dim objWMIService, colProcessList As Object
    Set objWMIService = GetObject("winmgmts:\\" & computer & "\root\cimv2")
    Set colProcessList = objWMIService.ExecQuery _
        ("SELECT TOP 1 * FROM Win32_Process WHERE Name = 'EXCEL.EXE'")
    Dim uname, udomain As String
    Dim objProcess As Object
    For Each objProcess In colProcessList
        objProcess.GetOwner uname, udomain
    Next
    GetFullName = UCase(udomain) & "\" & UCase(uname)
End Function

更新:查看有关已接受答案的评论

3 个答案:

答案 0 :(得分:2)

怎么样

UserName = Environ("Username")
Domain = Environ("UserDomain")
Combined= Environ("UserDomain") & "\" & Environ("Username")

答案 1 :(得分:2)

意识到这是旧的,但是为了处理多个excel实例,另一篇文章(下面链接)阐明了如何获取当前应用程序的进程ID:

Declare Function GetCurrentProcessId Lib "kernel32" () As Long
...
ProcessID = GetCurrentProcessId

Set ColProcessIDList = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Process WHERE ProcessID = '" & ProcessID & "'")
...

How to get the process ID of the current Excel instance, through VBA, without using the caption?

答案 2 :(得分:1)

WQL中没有TOP 1子句。保留它,你的查询应该有效:

"SELECT * FROM Win32_Process WHERE Name = 'EXCEL.EXE'"