从Windows服务启动流程

时间:2019-01-31 12:30:24

标签: c# windows service

我编写了一个C#Windows服务(用于Windows 8.1(32/64位)和Windows 10),用于监视某些条件,当这些条件满足时,它将启动另一个Windows Forms应用程序,该应用程序带有一些控制消息的参数。显示给用户。我很清楚服务与用户会话进行交互的问题,该服务使用MSDN代码的(略有修改的)版本从用户会话中的服务启动进程,可以在此处使用:{{3} }

触发服务后,如果我指定的launchpath变量的值为C:\ Windows \ sysnative \ notepad.exe,它将在用户会话中愉快地启动记事本

但是,如果我尝试使用命令行调用其他WinForms应用程序:

string launchpath = "\"{0}Kiosk.exe\" \"{1}\" \"{2}\"";

{0}替换为:

launchpath = launchpath.Replace("{0}", AppDomain.CurrentDomain.BaseDirectory);

和其他两个占位符({1}和{2})被启动参数替换,运行该服务的计算机记录系统错误代码123,该链接https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content)告诉我,意思是“文件名,目录名称或卷标签语法不正确。“

我尝试对路径进行硬编码,移动WinForms应用程序,因此执行路径也位于c:\ windows \ sysnative中,但是似乎没有任何作用,我总是在日志中遇到相同的错误,而应用程序却没有加载。如果我为kiosk.exe应用程序创建了快捷方式,以便我可以传递一些测试参数,那么它将正常启动。

还有其他人遇到过吗?如果有任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

事实证明我在CreateProcessAsUser()方法中有一些参数以错误的方式调用。我原来的电话是:

if (CreateProcessAsUser(hToken, launchpath, null, IntPtr.Zero, IntPtr.Zero, false, 0, null, null, ref tStartupInfo, out tProcessInfo)) { ... }

无效,但是更改为:

if (CreateProcessAsUser(hToken, null, launchpath, IntPtr.Zero, IntPtr.Zero, false, 0, null, null, ref tStartupInfo, out tProcessInfo)) { ... }

效果很好。我仍然不确定为什么它能够正常启动记事本,但这又是一个谜...