![](/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.