【问题标题】:Use WMI to get current Windows username in VBA [closed]使用 WMI 在 VBA 中获取当前的 Windows 用户名 [关闭]
【发布时间】:2010-09-22 04:33:10
【问题描述】:

我想知道是否有一种简单的方法可以使用 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) 结束功能

更新:在接受的答案中查看 cmets

【问题讨论】:

    标签: excel automation wmi vba


    【解决方案1】:

    怎么样

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

    【讨论】:

    【解决方案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?

    【讨论】:

      【解决方案3】:

      WQL 中没有 TOP 1 子句。把它放在一边,你的查询应该可以工作:

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

      【讨论】:

      • 如果其他人使用另一个帐户登录该框怎么办?这个策略会失败吗?它能否获取其他用户可能正在运行的 Excel 并返回不正确的信息?顺便说一句,删除 TOP 1 有效。
      • 是的。如果不同用户启动了多个 Excel.exe 实例,该函数将返回最后枚举的 objProcess 的 uname 和 udomain,这不一定是调用它的实例。如果 Excell.Application 有 ProcessId 的属性会很容易...
      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 2010-11-13
      • 2012-07-20
      • 2014-06-22
      • 1970-01-01
      • 2011-01-06
      • 2011-05-15
      相关资源
      最近更新 更多