我希望我的Java应用程序成为一个交互式Windows服务(用户登录时具有GUI的Windows服务)。
我搜索了这个,我看到这样做的方法是拥有2个程序,第一个是服务,第二个是GUI程序并让它们进行通信 - 服务将从GUI程序中获取命令。
在我开始拆分程序之前,我注意到在“Java Service Wrapper”中有一个标志:
wrapper.ntservice.interactive = TRUE
此标志是否自动执行与以下手动配置相同的操作?
管理工具 - >服务 - >右键单击 - >属性 - >下 登录选项卡选中允许与桌面交互
这样有问题吗?我应该走很长的路,把我的程序分成两个程序(GUI和服务)吗?
感谢
答案 0 :(得分:1)
Prior to Windows Vista,所有服务和应用程序都在同一个会话中运行。这提供了允许Windows服务具有前端UI并直接与用户交互的便利,但也带来了安全风险。例如,使用提升的用户权限(例如,管理员权限)运行的Windows服务可能会通过利用UI而受到损害。
从Windows Vista开始,Windows服务在会话0中被隔离,而所有用户登录和应用程序都在其他会话中运行。从技术上讲,Windows服务仍然可以通过会话0与桌面交互,但是普通用户没有方便的方式来访问会话0.因此,当您的Windows服务可以弹出确认对话框时,用户将永远不会看到它,因为它显示在Session 0桌面上。此外,用户将无法确认对话框,这意味着Windows服务仍然“卡住”。
简而言之,让Windows服务与桌面交互不再可行。您必须创建Windows服务,然后创建前端应用程序并为它们提供一些通信方式,例如管道,套接字,共享内存等。在.NET中执行此操作的建议方法是使用{ {3}}(WCF)。我不确定使用Java是多么容易,并且本着完全公开的精神,我自己使用套接字。
HTH