已登录的用户,在 Golang 中 Windows 环境下。

3
我需要使用Golang获取本地Windows机器上当前登录的用户,与正在运行应用程序的用户不同(可以从内置函数user.Current()中获得)。我可以从cmd调用query user,这会给我所需用户的列表(需要字符串操作,但这不是问题)。我尝试过的代码是:
out, err := exec.Command("query", "user")
if err != nil {
  panic(err)
}
// ...do something with 'out'

这会产生错误:panic: exit status 1。如果我执行以下操作,同样会出现这种情况:
out, err := exec.Command("cmd", "/C", "query", "user")
...
2个回答

1

通常,对于这种问题,解决方案如下:

  1. 研究(使用MSDN和其他资源)如何使用Win32 API实现所述目标。
  2. 使用内置的syscall包(或者如果可用/需要,则使用辅助第三方包)从Go中进行调用。

第一步可以参考this,它提供了解决方案,基本上是“使用WTS”。

前进的方式是:

  1. 连接到WTS子系统¹。
  2. 枚举当前活动的会话。
  3. 查询每个会话以获取与其关联的用户身份信息。
第二步比较棘手,但基本上你需要研究其他人是如何做的。 请参阅thisthisthis以获取一些示例。
你还可以查看名为_windows*.go的文件, 在syscall包的Go源代码中

请注意,即使在单用户计算机上,与座位/会话管理相关的所有内容都通过WTS传输(取决于特定Windows版本的削弱程度)。至少从XP/W2k3开始就是这样。


0
package main

import (
    "fmt"
    "os/exec"
)


func main() {
    out, err := exec.Command("cmd", "/C", "query user").Output()
    if err != nil {
        fmt.Println("Error: ", err)
    }
    
    fmt.Println(string(out))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接