2012-03-23 65 views
1

我們有一個應用程序是部分標準EXE和部分WinService EXE。標準的EXE由註冊表的運行部分產生,並且在剛剛登錄的用戶憑證下登錄。WinService EXE設置爲自動運行,因此始終運行並以LocalSystem身份運行(基本上是管理員)。如何獲得標準EXE和WinService EXE以相互通信?

我們需要這兩個程序通過將信息寫入XML文件來共享數據。

當登錄用戶可以訪問已安裝的文件夾(C:\ Program Files \ ourApp)時,該應用程序正常工作。標準EXE寫入數據,WinService EXE讀取數據沒有問題,一切都很好。

但是,當登錄的用戶無權寫入已安裝的文件夾時,數據就會陷入UAC虛擬化和數據重定向,並在其他地方結束,而WinService不會從中找到也不能讀取它安裝文件夾。

爲了避免這種情況,我們嘗試將標準EXE和WinService EXE寫入並從%ProgramData%中讀取。這可以正常工作,但標準用戶無權寫入%ProgramData%。

我們不能使用%LocalAppData%,因爲對於登錄用戶來說,這將是C:\ Users \ LoggedInUser \ AppData \ Local,對於winservice它將是C:\ Users \ Administrator \ AppData \ Local。

在Vista和Win7中還有什麼地方可以啓用UAC虛擬化,這將允許只有用戶權限運行的標準EXE和運行爲LocalSystem的WinService相互通話。我們嘗試了註冊表,但問題更加嚴重。最後但並非最不重要。我們需要這個與XP無關的代碼。意思XP也有%ProgramData%,%LocalAppData%等環境變量,它可以在兩個工作。

+2

無論您提出什麼解決方案,都需要應對兩個用戶同時登錄(並運行您的應用程序)的可能性。 – 2012-03-24 04:17:18

+1

在安裝期間,您可以編輯'%ProgramData%\ YourAppDirectory'上的權限以允許向每個人寫入權限。這裏的默認權限:任何人都可以在那裏創建新的文件和文件夾,並且每個人都可以讀取它們,但只有創建者擁有者(和管理員)才能寫入這些文件。你可以改變它。您也可以更改'Program Files'中的權限,但不推薦使用;另外你不應該把數據寫入'Program Files'。 – 2012-03-25 08:47:10

回答

3

兩個想法:

  1. 讓每個應用程序使用命名管道 運輸揭露一個WCF端點,並讓他們在你選擇的一個簡單的界面 互相交談。
  2. 使用Memory Mapped Files與 進行通信,您使用的是磁盤文件。
+0

太棒了。答覆如此之快,謝謝!實際上,我問這個問題的同事(他沒有一個計算器的帳戶,所以他打了一個快速的電子郵件,並讓我在這裏發佈)。週一他會嘗試你的建議(和其他任何人)。所以謝謝,希望我會爲您的答案申請一個綠色的複選標記!現在,我會努力爭取。 – JustLooking 2012-03-23 20:43:08

+1

@JustLooking:如果消除磁盤文件不方便,我建議使用用戶的本地應用程序數據目錄(或者更確切的說是一個子目錄),並使用命名管道(或類似的IPC方法)來發送目錄路徑從應用程序到服務。 – 2012-03-24 04:20:21