【问题标题】:Error Code 0xc0000142 starting process from windows service错误代码 0xc0000142 从 Windows 服务启动进程
【发布时间】:2017-10-17 09:08:16
【问题描述】:

我在从 Windows 服务启动进程时遇到了一种情况

 _________
|         |           * Process 1
| Service |  -------> * Process ...
|_________|           * Process n

服务使用的代码如下:

    ProcessStartInfo startInfo = new ProcessStartInfo(executablePath, commandlineArgs);
    startInfo.WorkingDirectory = instancePath;
    startInfo.UserName = userB;
    startInfo.Password = passwordSecureString;
    startInfo.Domain = domain;
    startInfo.UseShellExecute = false;

    Process process = new Process
    {
      StartInfo = startInfo,
      EnableRaisingEvents = true,
    };

    process.Start();

现在,我有两个帐户 - 为简单起见,假设为 A 和 B。服务在第一个帐户下运行,并使用第二个帐户启动进程。

  • 两个帐户都在本地管理员组中
  • 两个帐户都有权作为服务登录
  • 已启用辅助登录服务(以防万一)
  • 操作系统:Windows Server 2012 R2。

下表应该表明在哪个帐户星座中会发生什么。


 _______________
|   |  A  |  B  |      
|===+=====+=====|
| A | OK  |  X  |
|---+-----+-----|
| B |  X  |  OK |
|___|_____|_____|
  • OK - 进程按预期启动
  • X - 服务没有出错,但进程立即终止。

...这让我假设用户更改会导致问题。

发生异常的详细信息:

在阅读了错误代码 142 之后,这是我目前尝试过的:

  • 不同的服务器
  • Windows 更新
  • 可再发行的 c++ 安装
  • 咖啡,然后是烈酒,然后是咖啡

任何人都可以与这个问题联系起来吗?

【问题讨论】:

  • 在会话 0 中运行并非设计为服务的程序从来都不是问题。 0xc0000142 的一个非常常见的原因是described here
  • 谢谢,汉斯。我不得不承认我还没有阅读链接的文章,但我会的。实际上,我忘了提到我还增加了非交互式桌面堆大小(如 [此处](blogs.msdn.microsoft.com/ntdebugging/2007/01/04/… ) 所示。
  • 解释(嗯,有点)和解决方案可以在here

标签: .net authentication windows-services credentials windows-server-2012


【解决方案1】:

Stephen Martin 已经解释了这里发生了什么,所以如果您遇到原始问题中描述的问题,您可能会对以下博客文章感兴趣:

http://asprosys.blogspot.de/2009/03/perils-and-pitfalls-of-launching.html

Stephen 解释说

再次糟糕,进程在哪里?检查事件日志(或者您可能收到了应用程序错误弹出窗口)。应该有一个应用程序错误条目,说明您的进程是错误的应用程序,user32.dll 或 kernel32.dll 是错误的模块,异常是:0xC0000142。这可能会有一些细微的变化,但基本上是说您的应用程序无法初始化。 原因是在初始化时,在运行任何应用程序代码之前,所有进程都附加到 Window Station,所有线程都附加到桌面,但您启动时使用的用户没有权限访问正在启动您的进程的 Window Station 和 Desktop,因此无法初始化。 必须调整 Window Station 和 Desktop 的安全描述符,以向该进程的用户授予 AllAccess 权限正在下启动。这是直接在 .Net 中做的事情,所以你可能会发现这里的安全包装类很有用

如果您不喜欢使用 Stephen 的库,您还可以查看 here 提供的其他解决方案(我还没有测试过)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2018-06-08
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多