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

时间:2020-03-05 18:51:08  来源:igfitidea点击:

我能够通过命令行和自定义的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...";

在调试模式下执行以下Ccode时,我还可以通过编程方式卸载应用程序。

CCode:

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服务运行时,相同的Ccode会产生以下失败输出:

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

补充评论:

  • 发出卸载命令的Windows服务与在"调试模式"下测试的代码在同一台计算机上运行。 Windows服务以本地系统帐户的身份运行/登录。
  • 我查阅了我的应用程序日志,并验证了在调试和发布模式下执行的命令参数是否相同。
  • 我已经咨询了事件查看器,但没有提供任何线索。

有什么想法吗?任何帮助将不胜感激。谢谢。

解决方案

回答

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

我怀疑问题是由于以LocalSystem运行而引起的。

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

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

回答

我过去在安装过程中遇到过类似的问题,一个客户正在使用SYSTEM帐户进行安装,这给非管理用户带来了各种权限问题。

如果应用程序未显示为"已安装",则MSI日志文件并不会真正,我建议从捕获系统帐户下的" MSIINV.EXE"的输出开始,这将为我们提供"当前安装的程序(或者该用户看到的安装程序)http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

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

回答

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

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

回答

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

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

回答

@保罗·拉隆德

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

显然,我们正在做某事。我进行了一项快速测试,其中包含在LocalSystem帐户下运行的服务以及卸载应用程序的运行,并且一切正常。你说的没错。 LocalSystem帐户具有安装它的应用程序所必需的卸载权限。我们保存了这一天。感谢反馈!