允许服务在Windows中与桌面交互

在services.msc>操作>属性>login>允许服务与桌面交互,我使我的服务与桌面交互。 这到底意味着什么? 我如何使用它来播放服务中的声音(MP3,WAV等)?

services.msc>操作>属性>登录>允许服务与桌面交互

我想在这里采取一些自由,试图解释你的问题从关键字。 将来,请花更多的时间来写下你的问题,这样对于另一个正在阅读和理解他人的人来说是有意义的。

对于名为“允许服务与桌面交互”的Windows服务,在属性窗口的“login”选项卡下有一个checkbox 如果您尝试以编程方式检查该框,则需要在使用CreateService API创build服务时指定SERVICE_INTERACTIVE_PROCESS标志。 (见MSDN )。

但是,请注意,从Windows Vista开始,严格禁止与用户直接交互的服务:

重要提示:从Windows Vista开始,服务不能直接与用户交互。 因此,标题为“使用交互式服务”一节中提到的技术不应在新代码中使用。

这个“特征”已经被打破了,而传统的观点认为你不应该依赖它。 服务并不意味着提供一个UI或允许任何types的直接用户交互。 微软一直警告说,从Windows NT的早期开始就可以避免这个function,因为可能存在安全风险。 拉里·奥斯特曼(Larry Osterman)认为,这总是一个糟糕的主意 。 而且他不是唯一的 。

有一些可能的 解决方法 ,但是,如果你绝对必须有这个function。 但我强烈build议您仔细考虑其必要性,并为您的服务探索替代devise。

由于该服务不会在用户会话的上下文中运行,因此您将创build另一个与该服务交互的应用程序。

例如,Microsoft SQL服务器有一个监视工具。 此应用程序在用户会话中运行,并连接到提供有关服务是否正在运行并允许您停止和启动数据库服务的信息的服务。

由于该应用程序在用户会话中运行,因此可以通过该应用程序与桌面进行交互。

您需要添加serviceinstaller并在serviceinstaller的commited事件中写下代码。

 using System.Management; using System.ComponentModel; using System.Configuration.Install; private void serviceInstaller1_Committed(object sender, InstallEventArgs e) { ConnectionOptions coOptions = new ConnectionOptions(); coOptions.Impersonation = ImpersonationLevel.Impersonate; ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions); mgmtScope.Connect(); ManagementObject wmiService; wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'"); ManagementBaseObject InParam = wmiService.GetMethodParameters("Change"); InParam["DesktopInteract"] = true; ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null); } 

wmiService = new ManagementObject(" Win32_Service .Name='" + serviceInstaller1.ServiceName + "'");

在64位机器?