我有一个程序在找到新版本MSI时自动进行自我更新。我曾经用VS2008安装项目创建MSI。我将开发迁移到了VS2013,失去了安装项目,尝试了IS并感到非常沮丧,最后终于用WIX降落。如何将wix msi设置为由admin管理广告运行
微星与维克斯创建做了所有我需要的,但在自动更新逻辑失败:
因为程序可以在一个受限用户帐户运行,当它检测到一个新的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,当它admin身份登录,但记录为作品时用户失败并且不要求提升权限。
我已经在Package部分设置了InstallPrivileges="elevated" InstallScope="perMachine"
并且没有什么区别(我尝试了所有可能的组合)。在我看来,MSI没有公布,但代码不会失败。看起来MSI总是以有限的权限运行。 我也尝试在产品的唯一一个功能中设置AllowAdvertise="yes"
。
我可以看到与VS2008生产的MSI的一个主要区别是后者有两个功能,管理员和用户。
是的,我仍然在试图找到这个根源。我一定会尝试你的建议,但我认为这是一种解决方法。我确信我在wix安装程序中做了错误的事情,因为当我使用VS2008安装项目进行部署时,它工作得非常完美。我已经阅读了很多关于msiexec如何处理管理员凭证,并且看到很多可能导致此问题但仍然无法解决的问题。无知是盲目的! :) – Aznarepse 2015-02-13 09:47:46
我同意这是一个hacky的解决方法。当您使用VS2008部署项目时,您是否确定部署环境和Windows Installer版本相同?也许你已经知道,但Windows UAC只在Vista中引入。我不知道是否Visual Studio的旧版本可能使用了后门,这可能导致UAC的某些方面出现问题,但我不会感到惊讶。感谢微软保持我们的猜测。 – 2015-02-13 20:36:54