繁体   English   中英

从 Windows 服务启动进程

[英]Launching processes from a Windows Service

我编写了一个 C# Windows 服务(用于 Windows 8.1(32/64 位)和 Windows 10),它监视某些条件,当满足这些条件时,它会启动另一个 Windows 窗体应用程序,其中包含一些控制显示给用户。 我很清楚服务与用户会话交互的问题,该服务使用(稍微)修改过的 MSDN 代码版本从用户会话中的服务启动进程,可在此处获得: https:// code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

当服务被触发时,如果我指定的启动路径变量的值为 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://docs.microsoft.com/en-us/ windows/desktop/debug/system-error-codes--0-499- ) 告诉我的意思是“文件名、目录名或卷标语法不正确。”

我尝试对路径进行硬编码,移动 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)) { ... }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM