我可以通过命令行和自定义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."
补充评论:
思考?任何帮助将不胜感激。感谢。
答案 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帐户需要为其安装的应用程序卸载权限。你救了这一天。感谢您的反馈!