C# 从Windows服务启动进程
我已经编写了一个C#Windows服务(在Windows 8.1(32/64位)和Windows 10上使用),用于监视特定条件,当满足这些条件时,它将启动另一个Windows窗体应用程序,其中包含一些参数,用于控制向用户显示的消息。我很清楚服务与用户会话交互的问题,并且该服务使用(稍微)修改的MSDN代码版本从用户会话中的服务启动流程,可在此处获得: 触发服务时,如果我指定的launchpath变量的值为C:\Windows\sysnative\Notepad.exe,它将在用户会话中愉快地启动Notepad 但是,如果我尝试使用命令行调用其他WinForms应用程序:C# 从Windows服务启动进程,c#,windows,service,C#,Windows,Service,我已经编写了一个C#Windows服务(在Windows 8.1(32/64位)和Windows 10上使用),用于监视特定条件,当满足这些条件时,它将启动另一个Windows窗体应用程序,其中包含一些参数,用于控制向用户显示的消息。我很清楚服务与用户会话交互的问题,并且该服务使用(稍微)修改的MSDN代码版本从用户会话中的服务启动流程,可在此处获得: 触发服务时,如果我指定的launchpath变量的值为C:\Windows\sysnative\Notepad.exe,它将在用户会话中愉快地启
string launchpath = "\"{0}Kiosk.exe\" \"{1}\" \"{2}\"";
其中{0}替换为:
launchpath = launchpath.Replace("{0}", AppDomain.CurrentDomain.BaseDirectory);
另外两个占位符({1}和{2})被启动参数替换,服务运行的机器记录系统错误代码123,该链接告诉我这意味着“文件名、目录名或卷标语法不正确”
我尝试过对路径进行硬编码,移动WinForms应用程序,使其执行路径也在c:\windows\sysnative中。但是似乎什么都不起作用,我总是在日志中遇到相同的错误,并且应用程序没有加载。如果我创建了kiosk.exe应用程序的快捷方式,以便传入一些测试参数,它将正常启动
还有其他人遇到过这种情况吗?如果有任何建议,我将不胜感激。结果表明,我在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)) { ... }
它工作得很好。我仍然不知道为什么它能够正常启动记事本,但这是另一天的秘密…当异常发生时,
launchpath
的确切值是多少(请检查-不要猜测)?任何读取此文件的人都可能希望名为launchpath
的变量作为lpApplicationName
参数传递,而不是lpCommandLine
。实际上,两者都用是好的。将完全限定路径作为lpApplicationName
传递到“Kiosk.exe”,然后在lpCommandLine
中使用“Kiosk.exe”或“Kiosk”。