C# 允许Windows服务与桌面交互

C# 允许Windows服务与桌面交互,c#,windows-services,desktop,C#,Windows Services,Desktop,如何以编程方式启用“允许服务与桌面交互” 在services.msc>操作>属性>登录>允许服务与桌面交互中,我可以启用我的服务与桌面交互。我希望我的服务能够播放声音(MP3、WAV等) 由于服务不在用户会话的上下文中运行,因此您可以创建第二个应用程序来与服务交互。 例如,Microsoft SQL server有一个监视工具。此应用程序在用户会话中运行,并连接到服务,向您提供有关服务是否正在运行的信息,并允许您停止和启动数据库服务 由于该应用程序确实在用户会话中运行,因此您可以通过该应用程序与

如何以编程方式启用“允许服务与桌面交互”

在services.msc>操作>属性>登录>允许服务与桌面交互中,我可以启用我的服务与桌面交互。我希望我的服务能够播放声音(MP3、WAV等)


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

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


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

在这里,我将尝试从关键字解释您的问题。今后,请花更多的时间写下你的问题,以便让其他试图阅读和理解这些问题的人理解这些问题

“属性”窗口中的“登录”选项卡下有一个名为“允许服务与桌面交互”的Windows服务的复选框。如果您试图以编程方式选中该复选框,则在使用API创建服务时,需要指定“服务交互”进程标志。(见附件)

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

重要提示:自开始,服务无法直接与用户交互 WindowsVista。因此, 本节中提到的技术 使用交互式服务命名 不应在新代码中使用

这一“特征”已经被打破,传统智慧认为你无论如何都不应该依赖它。服务并不意味着提供UI或允许任何类型的直接用户交互。微软一直警告说,由于可能存在安全风险,自WindowsNT问世之初起,就应避免使用此功能。拉里·奥斯特曼认为这是为什么。他是


但是,如果您绝对必须拥有此功能,则还有一些。但我强烈要求您仔细考虑它的必要性,并为您的服务探索替代设计。

< P>您需要在Service Enguler-Eclipse的事件中添加Service安装程序并在代码下面写下。
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);
}

我在windows服务中有计时器和notifyicon,其中taskabar上下文菜单中的notify警告未启用我有一个很好的示例说明为什么需要启用此功能。我的服务可以执行自定义用户脚本。有时,这些脚本中的应用程序有一个应用程序UI,而没有相应的控制台版本。如果未启用此选项,应用程序将无法启动,脚本将基本失败。我个人并不是以我需要选项的方式编码服务,这是启用服务的真正用例。+1很棒的文章,特别是考虑到缺少来自OPSo的信息,如何运行GUI测试服务(如Selenium)?“与桌面交互”对于使用真实浏览器进行测试非常有用(我的意思是无头),而无需打开会话。。。在纯服务模式下,浏览器似乎不够稳定……你能解释一下这段代码将如何启用“与服务交互”吗?@Palec你的编辑完全改变了这个问题的含义。最初的问题是如何以编程方式启用“允许服务与桌面交互”。您的编辑随后更改了问题,询问这允许您做什么。@John,正如我在编辑说明中所写,我只是添加了OP在问题下的评论信息,可能还有其他一些旨在澄清问题的信息。它揭示了这个问题背后的意图。我同意,它稍微改变了问题,我没有得到程序变更的原始要求。将尝试在保留问题主要思想的同时将信息添加回问题中。