2008-09-10 72 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