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



我有一个程序,当它找到较新版本的MSI时会自动更新。我曾经使用VS2008安装项目创建MSI。我将开发迁移到VS2013,丢失了安装项目,尝试了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,它在以管理员身份登录时可以工作,但以用户身份登录时它会失败并且不要求提升权限。

我已经在"包"部分中设置了InstallPrivileges="elevated" InstallScope="perMachine"并且没有区别(我已经尝试了每种可能的组合(。在我看来,MSI 没有做广告,但代码不会失败。看起来 MSI 始终以有限的权限运行。我还尝试在产品的唯一一个功能中设置AllowAdvertise="yes"

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

我不知道

您是否仍在为这个问题而苦苦挣扎,但是我在使用NSIS构建的安装程序中遇到了类似的问题,所以也许这会对您或其他人有所帮助。在我的情况下,我能够通过使用命令外壳间接寻址来克服这个问题,如下所示(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 在 MSDN 博客上解释的内容有关,顺便在您的相关问题的答案中引用了该博客。

我希望这有帮助!

最新更新