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

use*_*989 14 c# desktop windows-services

在services.msc>操作>属性>登录>允许服务与桌面交互,我启用了我的服务与桌面交互.这究竟是什么意思?如何使用它从我的服务中播放声音(MP3,WAV等)?

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

Cod*_*ray 28

我会在这里尝试从关键词解释你的问题.将来,请花更多时间撰写您的问题,以便他们对试图阅读和理解它们的其他人有意义.

Windows服务的"属性"窗口的"登录"选项卡下有一个复选框,名为"允许服务与桌面交互".如果您尝试以编程方式检查该框,则需要在SERVICE_INTERACTIVE_PROCESS使用CreateServiceAPI 创建服务时指定该标记.(参见MSDN).

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

重要说明: 自Windows Vista起,服务无法直接与用户交互.因此,不应在新代码中使用标题为使用交互式服务的部分中提到的技术.

这个"特征"被打破了,传统的智慧决定了你不应该依赖它.服务不是为了提供UI或允许任何类型的直接用户交互.微软一直在警告,自Windows NT早期以来,由于可能存在安全风险,因此可以避免此功能.拉里奥斯特曼争辩说为什么这总是一个坏主意.而且他不是唯一的一个.

这里一些可能的 解决方法,但是,如果你绝对必须具有此功能.但我强烈建议您仔细考虑其必要性,并为您的服务探索其他设计.

  • 那么如何运行 GUI 测试服务(例如 Selenium)?与桌面交互对于使用真实浏览器进行测试非常有用(我的意思是没有无头),而不必保持会话打开...在纯服务模式下浏览器似乎不够稳定... (2认同)

Pie*_*kel 6

由于该服务不在用户会话的上下文中运行,因此您将创建第二个与该服务交互的应用程序.

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

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


小智 5

您需要添加 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 您能否解释一下此代码如何启用“与服务交互”? (3认同)