从理论上讲,这是不可能的,因为在Linux和Windows上,用户身份的概念仅存在于OS级别的线程中,goroutines 不是 OS线程-
而是轻量级实体,它们映射到真实的OS线程由Go调度程序(可执行文件内置的Go运行时的一部分)提供,并且在其生命周期内,goroutine可能在不同的时间在不同的OS线程上执行。
但是针对您的情况,存在某种“退出舱门”,其最初旨在帮助调用
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()在实际场景中调用会导致将整个OS线程专用于单个goroutine(而通常它们中的很多都只能在一个goroutine上运行),因此,如果您计划生成许多此类锁在OS线程中的goroutine,准备应对增加的OS资源使用情况。
更新: 一个工作示例,该示例在带有Go
1.2.1 / i386的Windows XP Pro SP3 32位上进行了测试。
它对由密码“ foo”标识的用户“ foo”进行硬编码。要在Windows上快速创建用户,请执行
net user foo * /ADD
并在出现提示时键入两次密码。



