![](/img/trans.png)
[英]Find “Allow service to interact with desktop” checked (in the service properties) of Windows Service
[英]Allow Windows service to interact with desktop
我将在这里冒昧地尝试从关键字中解释您的问题。 将来,请花更多时间写下您的问题,以便让其他试图阅读和理解它们的人有意义。
在 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.