互動式服務檢測

互動式服務檢測

互動式服務檢測是Microsoft WindowsWindows Vista以前的互動式服務在Windows Vista及以後的作業系統中無法正常工作的問題(Session 0隔離)給出的應對方案。然而,此方案並不能較好的解決問題(需切換視窗站),故不建議使用在Windows Vista及以後的系統中使用互動式服務。

服務描述:啟用互動服務需要用戶輸入時進行用戶通知,這樣,便可以在互動服務創建的對話框出現時訪問這些對話框。如果停止此服務,則對新互動服務對話框的通知將無法正常運行,而且可能無法訪問這些互動服務對話框。如果已禁用此服務,則不再有新的互動服務對話框通知,也無法訪問這些對話框。

基本介紹

  • 中文名:互動式服務檢測
  • 外文名:Interactive Services Detection
  • 別譯:互動服務檢測
  • 性質:Windows服務程式
  • 進程名:UI0Detect.exe
  • 檔案性質:64位
  • 服務名:UI0Detect
  • 登入賬戶:LocalSystem
  • 互動式服務:是
界面,普通用戶方案,方案1,方案2,方案3,編程者方案,方案1,方案2,

界面

互動式服務檢測在Windows 7下的界面,其他系統的類似。
互動式服務檢測
互動式服務檢測
互動式服務檢測

普通用戶方案

方案1

禁用互動式服務檢測
使用方法:
禁用過程禁用過程
方法1:(通用)
1、打開命令提示符,輸入“net stop UI0Detect”(兩側無分號,不區分大小寫)(意義:停止UI0Detect服務)
2、繼續鍵入“sc config UI0Detect start= disabled”(意義:將UI0Detect設為禁用)
方法2:(以Windows 7為例)
1、打開服務控制臺(任務管理器或管理控制台的都可以)。
2、找到“Interactive Services Detection”項目,右鍵單擊,單擊屬性。
3、將啟動類型改為“禁用”,並單擊“停止”。
4、單擊“套用”或“確定”。
優點:節約系統記憶體,減少CPU使用率,避免工作時系統列上突然多出一個圖示。
缺點:對新互動服務對話框的通知將無法正常運行,而且可能無法訪問這些互動服務對話框,並可能造成服務暫停或崩潰,未解決根本問題。
恢複方法:
方法1:(通用)
恢復過程恢復過程
1、在命令提示符中輸入“sc config UI0Detect start= auto”。(意義:將UI0Detect設為自動啟用)
2、繼續輸入“net start UI0Detect”(意義:立即開始UI0Detect服務,無需重啟)
方法2:(以Windows 7為例)
在服務屬性中將啟動類型改為“自動”,單擊“套用”,並單擊“啟動”。

方案2

聯繫開發者,請求更新的版本
優點:可靠,功能全面。
缺點:一個開發周期通常很長,在開發周期內無替代方法。

方案3

用其他程式替代
優點:可靠,耗時短。
缺點:很難找到兼容性足夠高的程式,程式界面與接口不一致。

編程者方案

典型情況下,服務是那些被設計沒有圖形用戶界面的無人控制的控制台應用程式。但是,一些服務可能需要與用戶偶爾進行互動。這個頁面討論了從服務與用戶進行互動的最好方法。
截至Windows Vista,服務不能與用戶直接進行互動。(註:意義為在Windows Vista前都可以)然而,在標題為“使用互動服務”一節中提到的方法不應該在新的代碼中被使用。(註:僅為了兼容)

方案1

不直接的與用戶進行互動
你可以使用下列技術來從運行於所有版本Windows的服務與用戶進行互動:
1、通過使用WTSSendMessage來在用戶的會話中彈出對話框。(註:對話框實際屬於指定會話的csrss.exe,可以使用WTSGetActiveConsoleSessionId來獲得當前活動會話號)
2、創建一個獨立的隱藏GUI套用(註:指不顯示界面)並使用CreateProcessAsUser函式來在活動用戶上下文中運行應用程式。將GUI應用程式設計為通過一些進程間通信(IPC)方法,比如命名管道,與服務通信。服務與GUI套用交流以告訴它(GUI套用)何時顯示GUI。應用程式將與用戶的互動結果回復給服務,服務由此可以進行適當的操作。注意IPC可能將服務接口暴露在網路上,除非你使用適當的ACL
如果服務運行在一個多用戶系統,將應用程式(註:指GUI套用)添加在下列鍵中由此它可以運行在每一個會話中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。如果套用為IPC使用命名管道,伺服器可以通過給每一個管道基於會話ID的唯一名字區分出每一個用戶的進程
下列技術在Windows Server 2003Windows XP中也有效:
通過調用包含MB_SERVICE_NOTIFICATION的MessageBox顯示一個信息盒子。這是顯示簡單狀態信息的推薦方法。不要在服務的初始化中或從HandlerEx例行程式中調用MessageBox,除非你從一個單獨的執行緒中調用,由此你可以在及時方法中返回服務控制管理(SCM,Services Control Manager)。

方案2

使用互動服務
默認情況下,服務使用不互動視窗站並無法與用戶互動。然而,一個互動式服務可以顯示用戶界面並接受用戶輸入。
注意:服務運行在更高的安全上下文中,例如LocalSystem賬戶,不應該在活動桌面創建視窗,因為在互動桌面運行的其他套用可以與此視窗互動。這將將服務暴露於登入的用戶運行的一切應用程式中。類似的,作為LocalSystem登入的服務不應該使用OpenWindowStation或GetThreadDesktop函式使用當前桌面
為了添加互動式服務,用以下方法調用CreateService函式:
1.使用NULL作為lpServiceStartName的參數值以將服務運行為LocalSystem賬戶上下文。
2.使用SERVICE_INTERACTIVE_PROCESS。
為了測試服務是否作為互動式服務運行,調用GetProcessWindowsStation函式來去的視窗站的句柄,並使用GetUserObjectInformation函式測試視窗站是否有WSF_VISIBLE屬性。
然而,注意下列註冊表鍵包含的NoInteractiveServices,那控制了SERVICE_INTERACTIVE_PROCESS的作用效果:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
NoInteractiveServices的值默認為1,那意味著沒有服務被允許互動式運行,無論它是否有SERVICE_INTERACTIVE_PROCESS。當NoInteractiveServices被設為0,有SERVICE_INTERACTIVE_PROCESS的服務被允許互動式運行。
對於Windows7, Windows Server 2008 R2, WindowsXP和Windows Server2003,NoInteractiveServices的值默認為0,這意味著使用SERVICE_INTERACTIVE_PROCESS的服務被允許互動式運行。當NoInteractiveServices被設為非0值,沒有服務在那之後允許被以互動式運行,無論它是否有SERVICE_INTERACTIVE_PROCESS
重要:所有的服務都在終端服務的0號會話(Terminal Services session 0)運行。然而,如果一個互動式服務(interactive service,註冊SERVICE_INTERACTIVE_PROCESS)顯示了一個用戶界面(user interface,UI),它只對連線到0號會話(session 0)的用戶可見。因為沒有方法保證互動式用戶(interactive user,LogonUser時使用LOGON32_LOGON_INTERACTIVE)連線到0號會話,不要將一個服務設定為在終端服務或在支持快速用戶切換(fast user switching)的系統下運行的互動式服務。(快速用戶切換是通過終端服務實現的)

相關詞條

熱門詞條

聯絡我們