Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Windows服务启动进程_C#_Windows_Service - Fatal编程技术网

C# 从Windows服务启动进程

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,它将在用户会话中愉快地启

我已经编写了一个C#Windows服务(在Windows 8.1(32/64位)和Windows 10上使用),用于监视特定条件,当满足这些条件时,它将启动另一个Windows窗体应用程序,其中包含一些参数,用于控制向用户显示的消息。我很清楚服务与用户会话交互的问题,并且该服务使用(稍微)修改的MSDN代码版本从用户会话中的服务启动流程,可在此处获得:

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

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

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”。