3

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

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

4

5 回答 5

2

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

我怀疑您的问题是由于作为 LocalSystem 运行造成的。

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

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

于 2008-09-10T23:34:31.293 回答
2

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

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

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

于 2008-09-11T00:47:41.960 回答
1

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

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

于 2008-09-11T22:24:15.837 回答
0

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

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

于 2008-09-12T02:32:46.380 回答
0

@保罗拉隆德

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

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

于 2008-09-12T22:14:17.960 回答