【发布时间】: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 的一个主要区别是后者有两个功能,管理员和用户。
【问题讨论】:
标签: wix windows-installer elevated-privileges