1

我想知道是否有一种简单的方法可以使用 WMI 为您获取当前带有域的 Windows 用户名。Windows API 调用只会为您获取简短的用户名,因此您最终会再次调用域名。我有一些代码,但出现自动化错误。有任何想法吗?我认为我走在正确的道路上,但我对 WMI 有点陌生。

函数 GetFullName() 作为字符串
    将计算机调暗为字符串
    电脑=“。”
    暗淡 objWMIService,colProcessList 作为对象
    设置 objWMIService = GetObject("winmgmts:\\" & computer & "\root\cimv2")
    设置 colProcessList = objWMIService.ExecQuery _
        ("SELECT TOP 1 * FROM Win32_Process WHERE Name = 'EXCEL.EXE'")
    Dim uname, udomain As String
    将 objProcess 调暗为对象
    对于 colProcessList 中的每个 objProcess
        objProcess.GetOwner uname, udomain
    下一个
    GetFullName = UCase(udomain) & "\" & UCase(uname)
结束功能

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

4

3 回答 3

2

怎么样

UserName = Environ("Username")
Domain = Environ("UserDomain")
Combined= Environ("UserDomain") & "\" & Environ("Username")
于 2008-11-13T23:31:15.000 回答
2

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

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

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

如何在不使用标题的情况下通过 VBA 获取当前 Excel 实例的进程 ID?

于 2013-04-19T11:41:06.243 回答
1

WQL 中没有 TOP 1 子句。离开它,您的查询应该可以工作:

"SELECT * FROM Win32_Process WHERE Name = 'EXCEL.EXE'"
于 2008-11-13T17:44:13.000 回答