我能够通过命令行和自定义 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服务与在调试模式下测试的代码在同一机器上运行。Windows服务正在运行/登录作为本地系统帐户。
  • 我已经咨询了我的应用程序日志,并验证了执行的命令参数在调试和发布模式下都是相同的。
  • 我已经咨询了活动查看器,但没有提供任何线索。

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

有帮助吗?

解决方案 3

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

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

其他提示

步骤1: 检查 MSI 错误日志文件

我怀疑您的问题是由于作为本地系统运行造成的。

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

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

我过去在安装时遇到过类似的问题,客户使用 SYSTEM 帐户进行安装,这导致非管理用户出现各种权限问题。

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

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

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

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

@保罗·拉隆德

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

显然,你正在做某事。我进行了一个快速测试,该测试在 LocalSystem 帐户下运行服务,安装并卸载应用程序,一切工作都完美无缺。你是对的。LocalSystem 帐户需要对其安装的应用程序具有卸载权限。你拯救了这一天。感谢您的反馈!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top