Process.Start 使用 ServiceUser 凭据进行模拟/在 ServiceUser 的上下文中运行代码(没有机器的登录权限)

Posted

技术标签:

【中文标题】Process.Start 使用 ServiceUser 凭据进行模拟/在 ServiceUser 的上下文中运行代码(没有机器的登录权限)【英文标题】:Process.Start impersonation with ServiceUser credentials / run code in the context of a ServiceUser (without login permissions to the machine) 【发布时间】:2020-09-16 09:41:26 【问题描述】:

我们有几个部门在 Windows 域 (Active Directory) 上拥有单独的服务帐户,并希望使用它们来模拟控制台命令以使用 Process.Start 运行它并在代码中设置用户名和密码。 Process.Start 需要一个 ProcessInfo 类对象,其中可以提供域、用户名和密码。

这些命令需要在这些服务帐户凭据下运行才能访问相关的网络共享并使用 cli 程序操作它们的结构和文件。

问题是,到目前为止,所有尝试在 IIS 服务器上的 web 服务或 api 中运行 Process.Start,我们仍然遇到了同样的问题:似乎是必需的,ProcessInfo 只能使用其他凭据,如果特定用户在正在运行的机器上具有登录权限。 所有服务用户都没有权限直接登录机器,所以命令无法运行,抛出异常。

异常信息: 登录失败:用户在这台计算机上没有被授予请求的登录类型

解决方法: 为了正确运行这些命令,我​​们正在考虑创建多个 webservice/api 实例并通过 IIS AppPool 模拟它并分配相关的服务用户。然后,每个实例将运行一个特定的服务,其中 IIS 为 webservice/api 提供服务。

我们的目标是在单个实例中完成 webservice/api 并更改从数据库中动态获取的用户凭据(用户名/密码)。

这有可能吗?

类似ServiceUser可以分配给windows服务(机器/服务器),不需要登录权限。

我只是想问一下,在我们采用变通方法并为此解决方案创建多个实例之前...欢迎任何帮助 cmets 或解决此挑战的不同想法。谢谢你,伙计们。

【问题讨论】:

【参考方案1】:

缺少的登录类型很可能是“作为批处理作业登录” - 查看授予服务帐户此权限是否有帮助。

实现这一点的具体步骤可能因 Windows 的不同版本而异,但大致如下;

    启动“本地安全策略”应用 (AKA secpol) 转到安全 转到设置 |当地政策 |用户权限分配 编辑“作为批处理作业登录”并添加您的服务帐户

如果这不起作用,请不要忘记撤消上述操作 - 不要留下实验性安全更改!

【讨论】:

对于 Process.Start (恕我直言)无法指定登录类型,同时不提供此选项的成员...docs.microsoft.com/en-us/dotnet/api/…您谈论模拟吗? @SiL3NC3 允许的登录类型是本地安全策略的一部分,而不是您可以在 Process.Start 指定的内容 - 我已经用您可以尝试的步骤更新了我的答案。

以上是关于Process.Start 使用 ServiceUser 凭据进行模拟/在 ServiceUser 的上下文中运行代码(没有机器的登录权限)的主要内容,如果未能解决你的问题,请参考以下文章

csharpcodeprovider:不能使用 Process.Start()

使用 Process.Start 修复 CA2122

使用 process.start 后如何退出主程序?

使用 Process.Start() 通过快捷方式运行应用程序

process.start() 参数

Process.Start 打开资源管理器