所以我有一个简单的例子,我有app A,它有一些硬编码信用给用户X,一个本地管理员,然后它用这些凭证使用硬编码的绝对路径启动应用B. A和B以及dotnet控制台应用程序,但它们不与控制台交互,只是将信息写入文件。
当我以交互方式运行A(在我的Creds下,通过双击,或通过CMD.exe,或交互式PowerShell会话,它运行良好。成功调用B
当我通过一个计划任务运行它,其中A由于信用不足而且用用户X调用B时,Process.Start(mystartinfo)的错误代码是 -1073741502 或0xC0000142(十六进制)表示“应用程序无法正确初始化”
但是,如果我运行使用用户X凭据调用A的计划任务,则可以正常工作..
我做了这个小测试主要是因为我在PowerShell中尝试从计划任务或远程处理中执行“start-job -Credential”,或者在powershell或System.Diagnostic> Process.Start中调用start-process时看到类似的行为在相同的场景中从PowerShell内部。起初我认为这是PowerShell中的一个错误,但它似乎更深。无论是Windows还是特别是Dotnet,我想知道这是否已知/记录,以及是否有任何变通方法。
答案 0 :(得分:2)
好的这篇文章已经很老了,但是我在同一个问题上运行(PowerShell启动过程失败,在通过服务运行时退出代码为-1073741502)。
显然,这与此问题(Why is this process crashing as soon as it is launched?)
Process.Start在内部调用CreateProcessWithLogonW(CPLW) 凭证已指定。无法调用CreateProcessWithLogonW 来自Windows服务环境(例如IIS WCF服务)。它 只能从交互式进程(应用程序)中调用 由通过CTRL-ALT-DELETE登录的用户启动。
我认为在运行计划任务时它会有类似的东西,它在Windows服务环境中运行。
可能会阻止从服务中运行您正在引发的API本机调用。
答案 1 :(得分:1)
我在Windows Server 2008R2下遇到了这样的行为。我的C#应用程序(A)启动进程B.
进程B无法在不访问Windows桌面的情况下运行,[无法调用Windows API CreateWindow(); ]在作为服务运行时(或通过调度程序)阻止运行 (这是为了防止使用“at / interactive cmd.exe”
进行众所周知的用户权限提升我建议您检查您正在使用的环境,并检查是否是同一个问题。如果是这样,那么您应该搜索如何删除对CreateWindow()API调用的引用或正确处理它。
不幸的是,我无法访问流程B,因此无法解决此问题。我最终在Server 2003机器上部署了该解决方案。
答案 2 :(得分:1)
因此,您有一个从预定任务(非交互式)运行的进程A,并将进程B作为X启动(本地管理员) 澄清:
您可以尝试使用ProcessMonitor查看哪个调用完全失败。我的猜测是B正在尝试与桌面进行交互,并且被拒绝了这样做的许可。
当您以用户A身份登录时,如果使用调度程序启动交互式进程,则窗口会正常显示。但是,如果您以用户B(比如访客用户)的身份登录并启动一个以A(例如本地管理员)身份运行的交互式流程,那么系统确实存在关于如何显示UI的问题
总而言之,如果您有一个使用未登录用户凭据的交互式流程,那么没有明确的赢家可以做什么。