当由一组信用卡下的计划任务启动的进程在不同的一组Cred下运行另一个程序时,Windows是否有限制

所以我有一个简单的例子,我有app A,它有一些硬编码信用给用户X,一个本地管理员,然后它用这些凭证使用硬编码的绝对路径启动应用B. A和B以及dotnet控制台应用程序,但它们不与控制台交互,只是将信息写入文件。

当我以交互方式运行A(在我的Creds下,通过双击,或通过CMD.exe,或交互式PowerShell会话,它运行正常。成功调用B

当我通过一个计划任务运行它,其中A由于信用不足而且用用户X调用B时,Process.Start(mystartinfo)的错误代码是-1073741502或hex的0xC0000142,这意味着“应用程序无法正确初始化”

但是,如果我运行使用用户X凭据调用A的计划任务,它可以工作..

我做了这个小测试主要是因为我在PowerShell中从计划任务或远程处理中执行“start-job -Credential”,或者在PowerShell中调用start-process或者在PowerShell中调用System.Diagnostic> Process.Start时看到类似的行为在相同的情况下。 起初我认为这是PowerShell中的一个错误,但它似乎更深。无论是Windows还是特别是Dotnet,我想知道这是否已知/记录,以及是否有任何变通方法。

好的,这篇文章已经相当陈旧,但我正在运行相同的问题(PowerShell启动过程失败,退出代码-1073741502,通过服务运行)。
显然这与此问题有关( 为什么这个进程一启动就会崩溃? )

当指定凭据时,Process.Start在内部调用CreateProcessWithLogonW(CPLW)。 无法从Windows服务环境(例如IIS WCF服务)调用CreateProcessWithLogonW。 它只能从Interactive Process(由通过CTRL-ALT-DELETE登录的用户启动的应用程序)调用。

我猜这是在运行计划任务时类似的东西,它在Windows服务环境中运行。
可能会阻止从服务运行您正在引发的API本机调用。

因此,您有一个从预定任务(非交互式)运行的进程A,并将进程B作为X(本地管理员)启动澄清:

  • 你是那个盒子的管理员吗?
  • B需要窗把手还是控制台把手?

您可以尝试使用ProcessMonitor来查看哪个调用完全失败。 我的猜测是B正在尝试与桌面交互,并且被拒绝了这样做的许可。

当您以用户A身份登录时,如果使用调度程序启动交互式进程,则窗口会正常显示。 但是,如果您以用户B(比如访客用户)的身份登录并启动一个以A(比如本地管理员)身份运行的交互式流程,那么系统确实在显示UI时应该做些什么

总而言之,如果您有一个使用未登录用户凭据的交互式流程,那么没有明确的赢家可以做什么。

我在Windows Server 2008R2下遇到了这样的行为。 我的C#应用​​程序(A)启动进程B.

进程B无法在不访问Windows桌面的情况下运行,[无法调用Windows API CreateWindow(); 在作为服务运行时(或由调度程序)运行时阻止运行(这是为了防止使用“at / interactive cmd.exe”进行众所周知的用户权限提升)

我建议检查您使用的环境并检查是否是同一个问题。 如果是这样,那么您应该搜索如何删除对CreateWindow()API调用的引用或正确处理它。

不幸的是,我无法访问进程B,因此无法解决此问题。 我最终在Server 2003机器上部署了该解决方案。