制作互动式Windows服务

我希望我的Java应用程序是一个交互式Windows服务(用户登录时具有GUI的Windows服务)。

我搜索了这个,我看到这样做的方法是有2个程序,第一个是服务,第二个是GUI程序并让它们进行通信 – 服务将从GUI程序获取命令。

在我开始拆分程序之前,我注意到在“Java Service Wrapper”中有一个标志:

wrapper.ntservice.interactive = TRUE

此标志是否与下面的手动配置一样自动执行此操作?

管理工具 – >服务 – >右键单击 – >属性 – >在“登录”选项卡下选中“允许与桌面交互”

这有问题吗? 我应该走很长的路,将我的程序分成两个程序(GUI和服务)?

谢谢

在Windows Vista之前 ,所有服务和应用程序都在同一会话中运行。 这提供了允许Windows服务具有前端UI并直接与用户交互的便利,但也带来了安全风险。 例如,使用提升的用户权限(例如,管理员权限)运行的Windows服务可能会通过利用UI而受到损害。

从Windows Vista开始,Windows服务在会话0中被隔离,而所有用户登录和应用程序在其他会话中运行。 从技术上讲,Windows服务仍然可以通过会话0与桌面交互,但普通用户没有方便的方式访问会话0.因此,当您的Windows服务可以弹出确认对话框时,用户将永远不会看到它,因为它显示在会话0桌面。 此外,用户将无法确认对话框,这意味着Windows服务仍然“卡住”。

简而言之,让Windows服务与桌面交互不再可行。 您必须创建Windows服务,然后创建前端应用程序并为它们提供一些通信方式,例如管道,套接字,共享内存等。在.NET中执行此操作的推荐方法是使用Windows通信基金会 (WCF)。 我不确定使用Java是多么容易,并且本着完全公开的精神,我自己使用套接字。

HTH