2012-07-18 144 views
4

我目前正在研究一個包含WCF服務,Windows服務和WPF應用程序的項目。 Windows服務與WCF通信,並且在某些情況下,必須啓動WPF應用程序以供用戶接收消息。 (WCF在遠程服務器上,其餘的在客戶端上)。發射時我遇到了一些障礙。我有服務將消息寫入應用程序日誌,以便我可以在某種程度上「調試」。 Windows服務運行下面的代碼沒有問題。Windows服務啓動和Exe

C#代碼,Windows服務:

WriteLog.WriteString("PostOffice.MessagesWaiting: Inside, starting up.", EventLogEntryType.Warning); 
// Call the WPF Application 
var messagingProcess = new Process(); 
var messageProcessStartInfo = new ProcessStartInfo(@"""C:\GoldenEyeMessages.exe"""); 
messageProcessStartInfo.CreateNoWindow = false; 
messageProcessStartInfo.UseShellExecute = false; 
messageProcessStartInfo.FileName = @"""C:\GoldenEyeMessages.exe"""; 
messageProcessStartInfo.WindowStyle = ProcessWindowStyle.Normal; 
messageProcessStartInfo.Verb = "runas"; 

messageProcessStartInfo.RedirectStandardOutput = true; 
messagingProcess.StartInfo = messageProcessStartInfo; 
messagingProcess.Start(); 
StreamReader daStreamReaderMan = messagingProcess.StandardOutput; 
string newString = daStreamReaderMan.ReadLine(); 

WriteLog.WriteString("PostOffice.MessagesWaiting: The Eagle has landed.", EventLogEntryType.Warning); 

的WPF應用程序不能在當前用戶的會話中執行。相反,我得到一個彈出窗口來查看消息。下面是它的照片:

enter image description here

一旦選擇了「查看消息」選項,它當然我切換到不同的會話,然後運行WPF應用程序。

我的問題是,我該如何着手讓WPF應用程序在當前用戶會話或「活動」會話內啓動?

+0

嗨 - 「WCF服務」,「Windows服務」和「WPF應用程序」都是完全不同的東西。更重要的是,它們都是完全不同的*種類*的東西。是的,他們都可以互相溝通:有很多方法可以做到這一點。是的,你可以進行設置,以便「事件」(例如,來自Windows服務的消息)可以觸發「操作」(甚至可能在用戶的桌面上啓動.exe)。但是否:Windows服務和WPF服務都存在於與用戶桌面完全不同的環境中。我不認爲你可以做你想做的事。 – paulsm4 2012-07-18 19:26:34

+0

@ paulsm4:*默認情況下*它們存在於不同的上下文中。人們確實可以授予Windows服務權限與桌面進行交互。這樣做並不明智。 – 2012-07-18 19:29:58

+0

@AngieLeigh:現在你有10個重點:-) – 2012-07-18 19:33:10

回答

7

因爲試圖啓動WPF可執行文件的用戶沒有與桌面進行交互的權限,所以您正在獲取該文件。

Windows服務通常不會在具有該權限的帳戶下運行,並且認爲這是一個安全漏洞。

在大多數情況下,建議您不要更改允許服務以與桌面設置進行交互。如果您允許該服務與桌面交互,則該服務在桌面上顯示的任何信息也將顯示在交互式用戶的桌面上。然後惡意用戶可以控制該服務或從交互式桌面攻擊它。

http://technet.microsoft.com/en-us/library/cc782435(v=ws.10).aspx

一個更安全的替代方案是有WPF應用程序始終在系統托盤中運行,並安排Windows服務的信號需要顯示的消息WPF應用程序的機制。一個簡單的機制是將文件寫入商定的位置,並使用WPF應用程序中的文件觀察器查找該文件(並在顯示後將其刪除)。請注意,在用戶登錄之前(在WPF應用程序運行很久之前),Windows服務可能會運行很久,所以無論您使用何種通知機制,都需要允許郵件在登錄後立即累積並顯示。

+0

謝謝!我可能無法使用這種確切的方式,但肯定會沿着這些方向。再次感謝:-) – AngieLeigh 2012-07-20 16:54:29

+0

很高興幫助... – 2012-07-20 17:04:53