【问题标题】:Uninstall Command Fails Only in Release Mode仅在发布模式下卸载命令失败
【发布时间】:2008-09-10 23:16:32
【问题描述】:

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

命令行执行:

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

想法?任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: c# installation service


    【解决方案1】:

    第 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 问题,您可能会遇到...

      【讨论】:

        【解决方案3】:

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

        [有关 LocalSystem 能够卸载其安装的应用程序的完整故事,请参阅其他 cmets。]

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 应用程序的安装程序包含在自定义 InnoSetup 安装程序中。反过来,InnoSetup 安装程序由登录用户手动执行。也就是说,卸载是由在本地系统帐户下运行的服务触发的。我会尝试安装和卸载服务。非常感谢。
          【解决方案5】:

          @保罗·拉隆德

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

          显然,您正在做某事。我进行了一项快速测试,该测试在 LocalSystem 帐户下安装并卸载了应用程序,并且一切正常运行。你是对的。 LocalSystem 帐户具有安装它的应用程序所需的卸载权限。你拯救了这一天。感谢您的反馈!

          【讨论】:

          • 如果您将手动执行的安装程序更改为每台机器,那可能也可以。但这需要安装用户具有本地管理员权限。
          猜你喜欢
          • 2011-05-21
          • 2018-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          相关资源
          最近更新 更多