从Windows服务启动进程时出现了一种情况
@[User::var_flag] == TRUE
服务使用的代码如下:
_________
| | * Process 1
| Service | -------> * Process ...
|_________| * Process n
现在,我有两个帐户 - 为了简单起见,比如说A和B.服务正在第一个帐户下运行,并使用第二个启动流程。
下表应该表明在哪个帐户星座中会发生什么。
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();
...这使我认为用户更改会导致问题。
有关发生的例外的详细信息:
OpenDJ configuration documentation #6.1.5
阅读错误代码142之后,这是我迄今为止所尝试的内容:
有人可以解决这个问题吗?
答案 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(我尚未测试过)。