我從Windows服務中使用如何獲取當前記錄的用戶會話ID?
ProcessStartInfo processStartInfo = new ....
Process.Start(processStartInfo);
的問題是運行過程中,如果我在本地系統帳戶下運行的服務,它運行正常的,但它並不顯示程序窗口。 我試圖把用戶憑據放在服務屬性中,但'允許服務與桌面交互'複選框變爲禁用狀態。
我真的需要運行應用程序從服務調用它,我真的需要看到應用程序的窗口。
請幫助我。
UPD。那麼,你使用過載的版本的Process.Start需要用戶名,密碼和域 - 它會將程序拖到桌面上。但現在它啓動應用程序在一個憑據下,但顯示在不同的用戶的桌面上。怎麼來的?
UPD2:我有個主意!我可以使用Sysinternals Suite中的psexec.exe。但問題是我需要以「管理員」的身份默默地開始這件事。我不知道如何。 我的意思是,即使你已經擁有管理員權限,有時你也必須手動說出「以管理員身份運行」,確認UAC並且只有在你準備好後才能進行。我不知道如何靜靜地運行一些東西,但不帶UAC的東西......
UPD3:親愛的主。我有這個東西!最後。
好的。在開始時,問題確實在會話0隔離的事情。所以我需要構建一個可以從服務啓動的中間應用程序,然後,該應用程序又將通過RPC啓動我的應用程序並將其引入桌面。與其構建中間層應用程序,我決定使用psexec工具(無論如何,它的工作方式與我需要的完全相同 - 通過RPC)。 當我嘗試在LOCAL SYSTEM帳戶下使用該工具時,由於某種原因它不起作用。然後我意識到 - 原因是MS放在每一個pstool中的該死的EULA彈出對話框,並且不可能在本地系統帳戶下點擊按鈕確認對話框。 所以解決的辦法是在註冊表HKU.DEFAULT \ Software \ Sysinternals \ PsExec中用DWORD值創建一個密鑰EulaAccepted = 1
Hooray,現在工作! 但是!現在我需要將程序帶到當前記錄的用戶屏幕。要做到這一點,我需要會話ID!
所以問題是:如何獲取當前登錄的用戶的會話ID?如果沒有人登錄,會發生什麼?會是什麼會話ID?
UPD4:就是這樣!我有那個! (DllImport(「Kernel32.dll」,EntryPoint =「WTSGetActiveConsoleSessionId」)] public static extern int WTSGetActiveConsoleSessionId();
謝謝你們!
我重新閱讀我的答案,並意識到我只給了你一半的解決方案......你應該拼湊你的最終解決方案,並將其添加爲答案而不是問題。在這裏發表回答你自己的問題是可以的:)讓未來有人閱讀這篇文章更清楚(有人會 - 這是一個比較常見的問題)。 – 2011-10-02 19:22:11