У меня есть программа, которая автоматически обновляется, когда находит более новую версию MSI. Раньше я создавал MSI с проектом установки VS2008. Я перенес разработку на VS2013, потерял проект установки, попробовал IS, очень расстроился и, наконец, остановился на WIX.
MSI, созданный с помощью WIX, делает все, что мне нужно, но не работает в логике автоматического обновления:
Поскольку программа может работать под учетной записью с ограниченными правами, при обнаружении более нового 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 в автоматическом режиме с текущим пользователем.
Это нормально работало с MSI, созданным с VS2008, но не с WIX MSI. Журнал msiexec:
«Ошибка 1730. Вы должны быть администратором, чтобы удалить это приложение ...»
Если я запускаю MSI вручную, он работает при входе в систему как администратор, но при входе в систему как пользователь он не работает и не запрашивает повышение привилегий.
Я установил InstallPrivileges="elevated" InstallScope="perMachine"
в разделе «Пакет», и это не имеет значения (я пробовал все возможные их комбинации). Мне кажется, что MSI не афишируется, но код не подводит. Похоже, что MSI всегда запускается с ограниченными привилегиями. Я также попытался установить AllowAdvertise="yes"
в единственной функции продукта.
Одно из основных различий, которое я вижу в MSI, созданном с VS2008, заключается в том, что последний имел две функции: Admin и user.