2010-11-10 82 views
0

我正嘗試使用msiexec構建更新程序來卸載程序,然後安裝更新的版本。
這裏是我的代碼:使用msiexec卸載獲取UAC錯誤,即使我已設置管理權限

command = "/x{[uninstall string here]}"; 
command += "/qn+ /Le c:\\test\\msilog.txt"; 
ProcessStartInfo psi = new ProcessStartInfo("msiexec"); 
psi.Arguments = command; 
//psi.UseShellExecute = true; 
//psi.Verb = "runas"; 
Process.Start(psi); 

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

集我的清單,並設置爲應用程序的清單。 當我運行這個時,我彈出框顯示「AppSetup失敗」,並且日誌文件顯示

錯誤1730.您必須是管理員才能刪除此應用程序。要刪除此應用程序,您可以以管理員身份登錄,或與技術支持小組聯繫以獲得幫助。

但是,如果我運行CMD以管理員身份,並在

msiexec /x{[uninstall string here]} /qn+ /Le c:\\test\\msilog.txt 

類型它的工作原理非常愉快。
我在這裏錯過了什麼?

(我也嘗試過取消註釋上面的那兩行,因爲這是我發現以管理員身份運行的一種方式,但它在嘗試執行之前彈出UAC對話框,即使設置了/ qn也是如此。)

+0

聽起來像是誤會。您無法隱藏UAC提示並仍然獲得管理員權限(除非禁用UAC)。 – 2010-11-10 17:44:54

+0

那麼,沒有辦法以編程方式使用msiexec的管理權限而無需某種用戶交互?如何在沒有用戶交互的情況下卸載我自己的程序? – Marcus 2010-11-10 18:03:49

+1

你沒有,因爲如果這是可能的,每個人都可以卸載任何其他人的「自己的程序」這種方式。 – 2010-11-10 18:34:49

回答

1

要提升進程,您需要讓用戶批准它。如果每個流程都可以在沒有用戶交互的情況下提升自身,那麼它會有點挫敗提升的目的。

我不知道您的完整場景,但是如果您可以設法從本地服務帳戶執行更新程序,那麼這應該在沒有用戶交互的情況下運行。想到的幾種方法是安裝Windows服務,本地服務帳戶的運行/運行密鑰或使用帶-s的psexec。當然,要實現這一點,您需要在客戶端計算機上擁有正確的權限。

祝你好運。

*還有一件事: 如果您還沒有研究過這個問題,您可以使用Windows Installer來更新您的安裝,而無需編寫您自己的「更新程序」。有3種不同類型的更新(小更新,小升級和主要升級):http://msdn.microsoft.com/en-us/library/aa370579(VS.85).aspx

重大升級會卸載以前的版本並安裝與您描述的內容最相似的新版本,儘管在大多數情況下小的更新和小升級更適合。

+0

啊。它將成爲服務的一部分,但我測試它的方式來自於控制檯應用程序。我把它放到服務中,它就可以工作。該服務位於LocalSystem帳戶上,因此我猜其中任何一個都可以。謝謝。 – Marcus 2010-11-10 20:11:22

+1

服務不受UAC限制,因爲根據定義,沒有用戶表示同意。 – 2010-11-12 10:14:33