当前位置: 首页 > 面试题库 >

在Windows上,是否可以以其他用户身份运行单个goroutine?

酆英达
2023-03-14
问题内容

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

背景知识:- 我想切换运行goroutine的用户,以便当我使用go-oci8时,可以更改在数据库连接期间传递给Oracle的OSUser)。我需要连接到数据库,它使用登录用户(OS用户)作为安全性的一部分。在Java中,我可以在建立连接的过程中更改环境变量(如果仅连接一个用户,则可以轻击用户名环境变量)。

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


问题答案:

从理论上讲,这是不可能的,因为在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

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



 类似资料:
  • 问题内容: 在Windows上以Python用户身份启动子进程的最佳方式是什么?最好是XP及更高版本,但如果仅在Vista和7上运行,我也可以接受。 问题答案: 我不确定您是否可以使用标准python库执行此操作。但是,pywin32软件包具有win32process.CreateProcessAsUser函数,可能是您需要的。

  • 问题内容: 但是我仍然不能以计算神的热爱,以不同的用户身份运行。这是我所做的步骤: 下载适用于jenkins的macosx pkg(LTS) 安装插件等和git 尝试建立它 我不断收到无法克隆的错误,因为詹金斯一直以匿名身份开始: 如何设置它,让詹金斯像我一样运行?我正在使用jenkins Web UI,因此它位于localhost:8080 我也尝试使用/ login登录,但是我什至无法使用我的

  • 问题内容: 我刚刚开始使用Jenkins CI,遇到了一个问题,我很想在文档或在线中找到答案。想知道是否有人可以提供一些建议? 我正在尝试使用它来自动部署托管在Github组织存储库(即私有)上的Django项目的dev和stage分支。目前,我有一个用户“ django”,可以通过Github部署密钥访问Github存储库。我的Jenkins用户无法访问该存储库。解决此问题的最佳实践是什么-我应

  • 问题内容: 伙计们,我需要在Ubuntu 14.04下以其他用户身份启动docker守护进程。我在sudoers和docker的组中都拥有该用户,但是,我需要的是docker守护进程以“测试”用户身份运行。 test @ test:/ usr / bin $启动docker 开始:拒绝发送消息,1条匹配规则;type =“ method_call”,sender =“:1.88”(uid = 11

  • 问题内容: 服务默认在启动时在我的RHEL盒上启动。如果我没记错的话,其他使用init中的init脚本的Linux发行版也是如此。 您认为使流程以我选择的(静态)用户身份运行的最佳方法是什么? 我到达的唯一方法是使用类似以下内容的方法: 但这似乎有点不整洁… 是否存在一些魔术,可以提供一种简单的机制来像其他非root用户一样自动启动服务? 编辑: 我应该说,我在此实例中启动的进程是Python脚本

  • 问题内容: 我正在尝试让python删除一些目录,但出现访问错误。我认为python用户帐户没有权限吗? 是我运行脚本时得到的。 我试过了 它们都返回相同的错误。 问题答案: 即使将文件和目录设置为“只读”,即使我们刚刚复制了文件和目录,我们也遇到了问题。为您提供某种异常处理程序来处理这种情况。您调用它并提供一个异常处理程序,如下所示: 您可能想尝试一下。