gpt4 book ai didi

windows - 在 Windows 上,是否可以以不同的用户身份运行单个 goroutine?

转载 作者:IT王子 更新时间:2023-10-29 00:40:34 25 4
gpt4 key购买 nike

如何将 goroutine 的运行委托(delegate)给 Windows 上的另一个非管理员帐户?我看到您可以使用 syscall.Setuid()Linux 上执行此操作。我看不到如何使用 Windows 系统调用包在 Windows 上执行此操作。我希望能够在程序运行时设置 goroutine 运行的帐户。这可能吗?

背景知识:- 我想切换运行 goroutine 的用户,这样当我使用 go-oci8 时,我可以更改在数据库连接期间传递给 Oracle 的操作系统用户(参见我的其他 question ).我需要连接到数据库,它使用登录用户(OS 用户)作为安全的一部分。在 java 中,我可以在连接设置期间更改环境变量(或者如果仅为单个用户连接,则轻弹用户名环境变量)。

我有用户数据库用户名(这与操作系统用户名相匹配)并且我得到了数据库用户密码。我没有用户的 Windows 登录密码。我希望能够以类似于我强调的 Linux 端口绑定(bind)示例的方式,从以管理员身份运行的主 go 程序中将运行 goroutine 委托(delegate)给所需的 Windows 用户。将 Oracle 登录更改为不使用 OS 用户不是一个选项,因此如果我无法解决它,它将返回到 Java :-(。

最佳答案

理论上,不,这是不可能的,因为在 Linux 和 Windows 上,用户身份的概念只存在于操作系统级别的线程中,而 goroutines 不是操作系统线程——相反,它们非常轻- 由 Go 调度程序(内置于可执行文件中的 Go 运行时的一部分)映射到真实操作系统线程的权重实体,并且在其生命周期中,一个 goroutine 可能会在不同的时间在不同的操作系统线程上执行。

但是对于您的情况,存在一种“退出舱口”,最初旨在帮助调用 C代码: runtime.LockOSThread() .一旦一个 goroutine 调用这个函数,它就会被困在它当前运行的线程上,并且无论如何都不会被安排在另一个线程上调用,直到 goroutine 退出或调用 runtime.UnlockOSThread()。 .

你可以这样使用:

go func() {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
impersonate() // acquires and assumes some other credentials
...
}

那个虚构的实现impersonate()功能超出了这个问题的范围;您可以使用 syscall 调用任何 Win32 API 函数包——请参阅标准 Go 库以获取示例。


注意调用runtime.LockOSThread()在现实世界中,导致将整个操作系统线程专用于一个 goroutine(虽然通常很多 goroutine 只在一个 goroutine 上运行)所以如果你计划生成很多这样的 goroutines 锁定到操作系统线程,请准备好处理增加的操作系统资源使用。

更新: a working example在带有 Go 1.2.1/i386 的 Windows XP Pro SP3 32 位上测试。

它硬编码由密码“foo”标识的用户“foo”。要在 Windows 上快速创建用户,请执行

net user foo * /ADD

并在出现提示时输入密码两次。

关于windows - 在 Windows 上,是否可以以不同的用户身份运行单个 goroutine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com