簡體   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