繁体   English   中英

允许 Windows 服务与桌面交互

[英]Allow Windows service to interact with desktop

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

在 services.msc > Action > Properties > Log On > Allow service to interact with desktop 中,我可以让我的服务与桌面交互。 我希望我的服务能够播放声音(MP3、WAV 等)。

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

我将在这里冒昧地尝试从关键字中解释您的问题。 将来,请花更多时间写下您的问题,以便让其他试图阅读和理解它们的人有意义。

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

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

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

这个“特性”被破坏了,传统智慧表明你不应该依赖它。 服务并非旨在提供 UI 或允许任何类型的直接用户交互。 由于可能存在安全风险,Microsoft 自 Windows NT 早期以来一直警告应避免使用此功能。 拉里奥斯特曼争论为什么它总是一个坏主意 而且他不是唯一一个

但是,如果您绝对必须拥有此功能,则一些可能的解决方法 但我强烈敦促您仔细考虑其必要性,并为您的服务探索替代设计。

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

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

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

您需要添加 serviceinstaller 并在 serviceinstaller 的已提交事件中写下以下代码。

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位计算机上?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM