我有一个程序,当它找到较新版本的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 博客上解释的内容有关,顺便在您的相关问题的答案中引用了该博客。
我希望这有帮助!