1

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

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

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

wrapper.ntservice.interactive=TRUE

此标志是与以下手动配置相同的自动方式吗?

管理工具->服务->右键单击->属性->在登录选项卡下检查允许与桌面交互

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

谢谢

4

1 回答 1

1

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

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

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

高温高压

于 2014-09-23T18:38:31.733 回答