错误代码0xc0000142从Windows服务启动进程

时间:2017-10-17 09:08:17

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

从Windows服务启动进程时出现了一种情况

@[User::var_flag] == TRUE

服务使用的代码如下:

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

现在,我有两个帐户 - 为了简单起见,比如说A和B.服务正在第一个帐户下运行,并使用第二个启动流程。

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

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

    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();
  • 确定 - 流程按预期启动
  • X - 服务没有错误,但进程立即终止。

...这使我认为用户更改会导致问题。

有关发生的例外的详细信息:

OpenDJ configuration documentation #6.1.5

阅读错误代码142之后,这是我迄今为止所尝试的内容:

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

有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

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

在这里,斯蒂芬解释说

  

再次哎呀,这个过程在哪里?检查事件日志(或者您可能已收到“应用程序错误”弹出窗口)。应用程序错误应该有一个条目,表明您的进程是错误的应用程序,user32.dll或kernel32.dll是错误模块,例外是: 0xC0000142 。这可能有一些细微的变化,但基本上它是说您的应用程序无法初始化。 原因是在初始化时,在运行任何应用程序代码之前,所有进程都附加到Window Station,并且所有线程都附加到桌面,但是您正在启动的用户没有权限访问正在启动进程的Window Station和Desktop,因为它无法初始化。 必须调整Window Station和Desktop的安全描述符,以便为用户提供AllAccess权限。正在推出。这是一个直接在.Net中做的恶魔,所以你可能会发现这里的安全包装类很有用

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