2014-02-18 58 views
0

我不得不執行與提升權限,像幾個命令的要求:可修改的服務的config文件殼(或類似)執行多個命令升高

  1. 調用程序(需要管理員權限)
  2. 淨停止爲MyService(需要管理員權限)
  3. 網開始爲MyService(需要管理員權限)

這一切動態,電子商務。 G。第一行可能包含代理設置,包括用戶名和密碼或對設置文件的任何其他修改。 (設置文件在程序文件夾中,程序修改設置文件是外部提供的,實際的信息將是用戶通過GUI輸入的。)

我想創建一個非常靈活的解決方案,使用cmd.exe進程重定向stdin和stdout。但是..它看起來像「runas」(需要ShellExecute)並且重定向輸入/輸出是獨佔的。 (另外,我注意到重定向和cmd.exe很難處理..我不得不編寫自己的函數,例如作爲ReadLine的替代品,因爲ReadLine需要在最後一個NewLine並等待,如果有是一個命令提示符(意思是你的文本行像c:\ bla>,但沒有NewLine。但是,不知道結果是什麼會導致寫一些通用的困難。)

有3種替代方案我可以想的:

  1. 得到UAC提示爲每一個命令(我想不是這樣的)
  2. 啓動升高的過程,這可以調用爲所欲爲 - >需要額外的項目文件(.exe),我想避免,也使部署更爲困難(附加文件)
  3. 上創建一個批處理文件飛,運行它提升。這也是我想避免的,因爲在那個文件中可以有純文本的密碼信息(例如代理用戶/密碼)。我至少必須確保始終覆蓋其內容,然後將其刪除。

如何來處理呢?

回答

1

我想你已經診斷過這個問題,並列舉了你可用的選項。在我看來,最好的選擇是使用runas創建一個新的高級過程,並讓這個過程來完成這項工作。

其他進程不一定是一個不同的可執行文件,它可能是您的現有可執行文件以特定的命令行參數啓動。一旦你有另一個進程運行提升,你當然可以使用cmd重定向stdin/stdout來完成這項工作。但是,爲什麼使用net stop/start而不是服務API?你可以做.config文件修改,而無需啓動一個單獨的過程?

+0

對於網絡啓動/停止是正確的,我可以簡單地使用System.ServiceProcess.ServiceController。在這裏使用命令行只是想法,因爲我想要使用cmd選項。我不想啓動這個應用程序,因爲它的代碼很大,所以一個小的,單獨的應用程序似乎是最不好的解決方案。此外,因爲我沒有(短谷歌)找到一個可靠的方式擺脫臨時文件 - 可能總是有一個鎖,但我想刪除它,或者應用程序可能會在最糟糕的時刻崩潰.. –

+0

@ AndreasReiff我不確定你應該擔心重新啓動相同的可執行文件。這並不重要,它是巨大的。它已經在運行。它已經被激化,它的一部分已經在記憶中。不應該是一個問題。請記住,UAC對話框將顯示暫停。 –