【发布时间】:2018-03-29 22:07:53
【问题描述】:
在这里找到了很多答案,但很少需要自己提出问题。希望我在正确的地方。
我正在尝试使用Start a .Net Process as a Different User 此处的代码从 c# 中启动一个衍生进程。基本上有一个与链接中的代码几乎相同的“启动器”进程,除了我将它包装在一个 try/catch 中,它以不同的用户身份启动一个衍生进程。当我从命令行运行时,它似乎工作正常,切换用户 ID 等...,我已经通过让生成的进程向标准输出报告它的凭据来验证这一点。
问题是我想从作为 NT Authority\SYSTEM 运行的进程运行启动器本身(允许运行外部进程的商业产品,因此凭据/权限被降级,我可以将 SSH 连接到另一个系统作为特定用户),当我这样做时,在进行 proc.start() 调用时会收到拒绝访问异常。我检查了权限,甚至尝试完全打开它们,但结果仍然相同。我已经在启动程序中放置了一个 sleep() 并让我的服务启动它,这样我就可以附加调试器,并且尝试运行 start 方法来生成子进程肯定是访问被拒绝异常。找到了这个Access Denied when executing Process.Start from Windows Service,看起来很相似,但是这么多年没有回答,我无法评论......还没有足够的代表......;)
作为 NT Authority\SYSTEM 运行的父进程是否有一些特别之处,链接中记录的方法错过了?任何想法/指针将不胜感激。
【问题讨论】:
-
Process在后台使用CreateProcessWithLogonW。每the docs:“您不能从在“LocalSystem”帐户下运行的进程调用CreateProcessWithLogonW,因为该函数使用调用者令牌中的登录SID,而“LocalSystem”帐户的令牌不包含此SID。作为替代,使用CreateProcessAsUser和LogonUser函数。”不过,我没有现成的样品。 -
顺便说一句,第三方应用程序作为本地系统运行并没有什么好的借口——它使得无法正确分配权限并使故障排除(和缓解!)安全问题变得更加困难。它应该在特定于该应用程序的本地帐户下运行(如果它是服务,您可以使用虚拟服务帐户,这样您就不必管理密码),可以将其添加到本地管理员组(如果绝对需要) .这样做,作为奖励,
Process.Start也将重新开始工作。 -
谢谢 Jeroen,我知道一定有更深层次的事情发生。顺便说一句,我 100% 同意你的第二条评论,不幸的是,我无法在这一点上强加我的意见。
标签: c#