2008-09-10 74 views
3

我可以通過命令行和定製的Inno Setup安裝程序成功卸載第三方應用程序。卸載命令僅在發佈模式下失敗

命令行執行:

MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn 

Inno Setup的命令:

[Run] 
Filename: msiexec.exe; Flags: runhidden waituntilterminated; 
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn"; 
StatusMsg: "Uninstalling Service..."; 

我也能夠執行在調試模式下面的C#代碼時編程卸載應用程序。

C#代碼:

string fileName = "MSIEXEC.exe"; 
string arguments = "/x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn"; 

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments) 
{ 
    CreateNoWindow = true, 
    UseShellExecute = false, 
    RedirectStandardOutput = true 
}; 

Process process = Process.Start(psi); 
string errorMsg = process.StandardOutput.ReadToEnd(); 
process.WaitForExit(); 

相同的C#代碼,但是,會產生當作爲已編譯的,部署了Windows服務運行以下失敗輸出:

"This action is only valid for products that are currently installed." 

附加評論:

  • 正在發行的Windows服務 卸載命令正在上運行與調試模式下測試的代碼是 相同的機器。 Windows 服務正在以 本地系統帳戶的身份運行/登錄。
  • 我已經查閱了我的應用程序日誌 並且我已驗證 執行的命令參數是 在調試和發佈模式下都是相同的。
  • 我已經諮詢了事件查看器 ,但它沒有提供任何線索。

想法?任何幫助將不勝感激。謝謝。

回答

1

感謝那些提供幫助。這似乎是一個權限問題。我已更新我的服務以使用管理員帳戶運行,並且能夠成功卸載第三方應用程序。對Orion而言,雖然本地系統帳戶是一個功能強大的帳戶,可以完全訪問系統 - http://technet.microsoft.com/en-us/library/cc782435.aspx - 它似乎沒有執行卸載的必要權限。

[參見關於在LocalSystem能夠卸載它安裝的應用程序完整的故事補充意見。]

2

第1步:Check the MSI error log files

我懷疑你的問題是由於作爲LocalSystem運行。

本地系統帳戶不同於恰好具有管理權限的普通用戶帳戶。它無法訪問網絡,它與註冊表和文件系統的交互有很大不同。

從內存中的任何請求讀取/寫入註冊表下的「主目錄」或HKCU實際上會進入默認的用戶配置文件,或在臨時迪爾斯情況下,c:\windows\temp

2

我遇到過去與安裝類似的問題,客戶使用SYSTEM帳戶進行安裝,這給非管理用戶帶來了各種權限問題。

如果應用程序沒有出現「已安裝」,MSI日誌文件並不真正有幫助,我建議先從系統帳戶下捕獲MSIINV.EXE的輸出開始,這將爲您帶來「庫存」當前安裝的程序(或者用戶看到安裝的內容)http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

我想你可能需要回到繪圖板,看看你是否真的需要windows服務來進行卸載。你可能會遇到各種Vista UAC問題,如果你還沒有...

0

這是奇怪的。 LocalSystem肯定有安裝應用程序的權限(這就是Active Directory中Windows Update和軟件部署的工作原理),因此它應該也能夠卸載。

也許應用程序最初是按用戶而不是每臺機器安裝的?

+0

該應用程序的安裝程序被封裝在自定義InnoSetup安裝程序中。 InnoSetup安裝程序反過來由登錄用戶手動執行。也就是說,卸載由在本地系統帳戶下運行的服務觸發。我會嘗試讓服務安裝並卸載。許多thx。 – 2008-09-12 15:17:59

0

@保羅拉隆德

應用程序的安裝程序是一個自定義InnoSetup安裝程序內包裹着。 InnoSetup安裝程序反過來由登錄用戶手動執行。也就是說,卸載由在本地系統帳戶下運行的服務觸發。

顯然,你是在做某件事。我整理了一個快速測試,其中服務在LocalSystem帳戶安裝下運行,並卸載應用程序,一切都完美無瑕。你是對的。 LocalSystem帳戶需要它安裝的應用程序的卸載權限。你保存了一天。感謝您的反饋!

+0

如果您將手動執行的安裝程序更改爲每臺計算機,那也可能起作用。但這需要安裝用戶擁有本地管理員權限。 – 2008-09-13 00:13:59