2013-05-03 76 views
1

我正在尋找實施一個功能,當一個應用程序作爲Windows服務(作爲本地系統)運行將顯示模式警告,類似於關機屏幕或UAC警告屏幕。基本上,東西是不可能解僱而沒有注意到繞過Windows會話隔離,在系統服務的用戶會話中顯示警告消息,Windows 7 +

有兩件事情,我不知道如何實現:

  1. 這是我的理解是Windows Vista中+不再允許應用程序生成系統模態窗口。有沒有可能繞過這一點,有沒有簡單的方法來做到這一點?我能想到的唯一選擇是打開一個全屏窗口並攔截alt +選項卡,ctrl + alt + del等

  2. 我也相信不可能在用戶會話中顯示用戶界面服務,因爲它在另一個會話中運行。有沒有可以繞過這個黑客的黑客?我能想到的一件事是:查找並注入代碼到在給定會話中運行的csrss.exe或winlogon.exe中,並調用遠程線程。另一種方法是obtain handle to winlogon and CreateProcessAsUser()。有另一種更簡單的方法嗎?

回答

2

如果服務正在運行作爲本地系統,WTSQueryUserToken是獲得一個令牌在給定的會話中運行代碼的最簡單方法。

而不是模式窗口,請考慮創建一個新的桌面(CreateDesktop)並切換到它。你不能禁止控制 - 刪除,但我相信,當control-alt-delete菜單被解散時,系統通常會返回到你的桌面。所有其他特殊鍵序列應該被抑制,因爲掛鉤僅影響與安裝它們的應用程序相關聯的桌面。

1
  1. 我不確定「系統模態窗口」是什麼意思。你的意思是即使在登錄屏幕上顯示給用戶的消息?

  2. 這是真的,即使在註冊表中將UserInteractive設置爲true,Vista和更高版本也不允許從服務訪問Windows GUI。有幾種方法,我這樣做的方式是我有一個簡單的幫助應用程序在後臺運行(而不是一個服務,只是一個連續的過程),它使用IPC遠程.NET處理簡單的消息,一個服務可以輕鬆連接併發送。如果你願意,我可以發佈一個更具體的例子,但現在這是一步一步的如何實現這個(我將在這個例子中使用.NET Remoting,但是同樣的基本原則應該適用於任何IPC解決方案你使用):

    1. 創建一個程序,使用IPC協議作爲.NET遠程服務器(而不是服務,只是一個連續的過程)。遠程接口應至少包含一個用於接受新數據的成員,在大多數情況下,字符串對我來說工作正常。實施的班級也應該能夠不斷處理新的消息。
    2. 使用步驟一中實現的可遠程接口連接到該服務,併發送要顯示給IPC服務器的消息。
    3. IPC服務應處理此消息並使用您的首選方式將其顯示給用戶或向用戶顯示消息。我個人在一個單獨的線程中使用模態表單,允許最終用戶複製郵件,如果他們喜歡。
+0

雖然這種方法比在用戶的情況下啓動的過程更簡單,請注意,這是效率較低;它需要一個額外的過程始終在用戶的上下文中運行。 – 2013-05-21 19:25:07

+0

就我而言,我將偵聽器卡在一個托盤應用程序中,該應用程序已用於管理/監視服務。是的,它確實需要在任何時候都運行另一個進程,但由於我們已經有了另一個以用戶登錄運行的進程,我只是把監聽程序放在那裏。當服務未作爲LocalSystem帳戶運行時,此技術也適用。 – 2013-05-21 19:45:37