卸载命令仅在发布模式下失败

时间:2008-09-10 23:16:33

标签: c# installer service

我可以通过命令行和自定义Inno安装程序安装程序成功卸载第三方应用程序。

命令行执行:

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

Inno设置命令:

[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();

但是,当作为已编译的已部署的Windows服务运行时,相同的C#代码会产生以下失败输出:

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

补充评论:

  • 正在发布的Windows服务 uninstall命令正在运行 与代码相同的机器 在调试模式下测试。 Windows 服务正在运行/登录 本地系统帐户。
  • 我查阅了我的应用程序日志 我已经验证了 执行命令参数是 在调试和发布模式下都一样。
  • 我咨询了事件查看器 但它没有提供任何线索。

思考?任何帮助将不胜感激。感谢。

5 个答案:

答案 0 :(得分:2)

第1步: Check the MSI error log files

我怀疑你的问题是由于运行LocalSystem造成的。

本地系统帐户与恰好具有管理员权限的普通用户帐户不同。它无法访问网络,它与注册表和文件系统的交互完全不同。

从内存中,任何读/写到您的“主目录”或HKCU的请求实际上都会进入默认用户配置文件,或者在临时目录的情况下,c:\windows\temp

答案 1 :(得分:2)

我在安装时遇到过类似的问题,客户使用SYSTEM帐户进行安装,这对非管理用户造成了各种各样的权限问题。

如果应用程序没有显示为“已安装”,MSI日志文件实际上没有帮助,我建议从系统帐户下捕获MSIINV.EXE的输出开始,这会让你“清单“当前安装的程序(或用户看到的安装程序)http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

我想你可能需要回到绘图板,看看你是否真的需要windows服务来进行卸载。如果你还没有......你可能会遇到各种各样的Vista UAC问题。

答案 2 :(得分:1)

感谢那些提供帮助的人。这似乎是一个权限问题。我已将服务更新为在管理员帐户下运行,并且能够成功卸载第三方应用程序。至于Orion的观点,尽管本地系统帐户是一个功能强大的帐户,可以完全访问系统 - http://technet.microsoft.com/en-us/library/cc782435.aspx - 它似乎没有必要的权限来执行卸载。

[有关LocalSystem能够卸载其安装的应用程序的全文,请参阅其他评论。]

答案 3 :(得分:0)

这很奇怪。 LocalSystem肯定具有安装应用程序的权限(这是Active Directory中Windows Update和软件部署的工作方式),因此它也应该能够卸载。

也许应用程序最初是按用户而不是按机器安装的?

答案 4 :(得分:0)

@Paul Lalonde

应用程序的安装程序包含在自定义的InnoSetup安装程序中。反过来,InnoSetup安装程序由登录用户手动执行。也就是说,卸载是由在本地系统帐户下运行的服务触发的。

显然,你有所作为。我整理了一个快速测试,该服务在LocalSystem帐户安装下运行,并卸载应用程序,一切都运行完美。你是对的。 LocalSystem帐户需要为其安装的应用程序卸载权限。你救了这一天。感谢您的反馈!