Как настроить запуск wix msi, объявленного администратором

У меня есть программа, которая автоматически обновляется, когда находит более новую версию 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.


person Aznarepse    schedule 02.12.2014    source источник


Ответы (1)


Я не знаю, боретесь ли вы с этой проблемой, но я столкнулся с аналогичной проблемой с установщиком, созданным с помощью 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);

Я не могу полностью объяснить, почему это работает, когда при прямом вызове установщика не удается передать необходимые учетные данные, но я почти уверен, что это связано с тем, что объясняется Крис Джексон в блоге MSDN, на который, кстати, есть ссылка в ответ на интересующий вас вопрос.

Надеюсь, это поможет!

person Michael Repucci    schedule 10.02.2015
comment
Да, я все еще пытаюсь найти корень этого. Я обязательно попробую ваше предложение, но считаю, что это обходной путь. Я убежден, что делаю что-то не так с установщиком wix, поскольку он работал безупречно, когда я использовал для развертывания проект установки VS2008. Я много читал о том, как msiexec обрабатывает учетные данные администратора, и вижу множество возможных причин этой проблемы, но все еще не могу ее решить. Незнание слепо! :) - person Aznarepse; 13.02.2015
comment
Я согласен с тем, что это обходной путь. Вы уверены, что среда развертывания и версия установщика Windows были идентичны, когда вы использовали проект развертывания VS2008? Возможно, вы уже знаете, но Windows UAC была представлена ​​только в Vista. Я не знаю, возможно, в старых версиях Visual Studio использовался черный ход, который обходил некоторые аспекты UAC, но я не удивлюсь. Спасибо, Microsoft, за то, что заставили нас гадать. - person Michael Repucci; 13.02.2015