如何设置 wix msi 以运行管理员广告

Posted

技术标签:

【中文标题】如何设置 wix msi 以运行管理员广告【英文标题】:How to set wix msi to run advertised by admin 【发布时间】:2014-12-02 15:31:26 【问题描述】:

我有一个程序可以在找到更新版本的 MSI 时自动更新。我曾经使用 VS2008 安装项目创建 MSI。我将开发迁移到 VS2013,丢失了 Setup 项目,尝试了 IS,非常沮丧,最终选择了 WIX。

使用 WIX 创建的 MSI 可以满足我的所有需求,但在自动更新逻辑中失败:

因为程序可以在受限用户帐户下运行,所以当它检测到较新的 MSI 时,它首先会使用管理员的凭据对其进行广告宣传。这些凭据以加密方式存储在 XML 文件中。 然后,一旦 MSI 被公布,它就会与当前用户一起启动。代码(简称)

Process^ advertise = this->advertiseMSI(shortpath,mydomain,myusername,mypassword);
advertise->WaitForExit();       
Process^ install = this->installMSI(shortpath);

advertiseMSI 在哪里:

Process^ process = gcnew Process();
process->StartInfo->UseShellExecute = false;
process->StartInfo->FileName = "C:\\Windows\\System32\\msiexec.exe";
process->StartInfo->Arguments = "/jm " + "\"" + msiPath + "\"";
process->StartInfo->WorkingDirectory = Environment::GetEnvironmentVariable("WINDIR");
process->StartInfo->UserName = userName;
process->StartInfo->Password = this->getSecureString(Password);
process->StartInfo->Domain = userDomain;
process->StartInfo->Verb = "runas";
process->Start();
return process;

installMSI 只是在当前用户的静默安装中启动 Msiexec。

这适用于使用 VS2008 创建的 MSI,但使用 WIX MSI 失败。 msiexec 的日志是:

“错误 1730。您必须是管理员才能删除此应用程序...”

如果我手动运行 MSI,以管理员身份登录时它可以工作,但以用户身份登录时它会失败并且不会要求提升权限。

我在 Package 部分设置了InstallPrivileges="elevated" InstallScope="perMachine" 并没有什么不同(我已经尝试了所有可能的组合)。在我看来,MSI 没有广告,但代码没有失败。看起来 MSI 总是以有限的权限运行。 我也尝试在产品的唯一一个 Feature 中设置AllowAdvertise="yes"

我可以看到使用 VS2008 生成的 MSI 的一个主要区别是后者有两个功能,管理员和用户。

【问题讨论】:

【参考方案1】:

我不知道您是否还在为这个问题苦苦挣扎,但我在使用NSIS 构建的安装程序时遇到了类似的问题,所以也许这会对您或其他人有所帮助。在我的情况下,我能够通过使用命令 shell 间接来克服这个问题,如下所示(C# 代码):

ProcessStartInfo processInfo = new ProcessStartInfo("cmd", "/C myapp_installer.exe /S /D"); // Options /S /D apply to myapp_installer.exe.
processInfo.UseShellExecute = false;
processInfo.Domain = domain;
processInfo.UserName = username;
processInfo.Password = password; // Obtain securely not hard-coded.
Process process = Process.Start(processInfo);

当直接调用安装程序无法通过所需的凭据时,我无法完全解释为什么会这样,但我很确定这与 Chris Jackson on the MSDN Blog 解释的内容有关,顺便提一下the answer to your related question.

我希望这会有所帮助!

【讨论】:

是的,我仍在努力寻找它的根源。我一定会尝试你的建议,但我认为这是一种解决方法。我确信我在 wix 安装程序中做错了,因为当我使用 VS2008 安装项目进行部署时,它运行完美。我已经阅读了很多关于 msiexec 如何处理管理员凭据的内容,并且看到了很多可能导致此问题的原因,但仍然无法解决。无知是盲目的! :) 我同意这是一个 hacky 解决方法。你确定你在使用VS2008部署项目时,部署环境和Windows Installer的版本是一样的吗?也许您已经知道,但 Windows UAC 仅在 Vista 中引入。我不知道旧版本的 Visual Studio 是否可能使用了回避 UAC 某些方面的后门,但我不会感到惊讶。感谢 Microsoft 让我们不断猜测。

以上是关于如何设置 wix msi 以运行管理员广告的主要内容,如果未能解决你的问题,请参考以下文章

使用管理员权限在 Wix msi 中运行 .exe

尝试从 WIX msi 运行嵌入式工具以进行选择性安装

Wix延迟自定义操作访问被拒绝

一旦通过Wix安装到程序文件文件夹,C#exe就无法正常工作

如何强制 WiX 引导程序下载 MSI 包?

如何使用 WiX 和 MSI 进行静默安装和卸载?