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

问题描述 投票:0回答:2

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

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

发生异常的详细信息:

阅读完错误代码 142 后,这是我迄今为止尝试过的操作:

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

任何人都可以解决这个问题吗?

.net authentication windows-services credentials windows-server-2012
2个回答
1
投票

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

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

史蒂芬在这里解释

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

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


0
投票

我目前正在尝试在 arduino IDE 中验证我的代码,并遇到相同的错误,只是在这种情况下它出现在 IDE 中,任何人都可以帮助我

© www.soinside.com 2019 - 2024. All rights reserved.