Команда удаления завершается сбоем только в режиме выпуска
Вопрос
Я могу успешно удалить стороннее приложение через командную строку и с помощью специального установщика Inno Setup.
Командная строка Выполнение:
MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn
Команда настройки Inno:
[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated;
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";
Я также могу удалить приложение программно при выполнении следующего кода C# в режиме отладки.
Код С#:
string fileName = "MSIEXEC.exe";
string arguments = "/x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
};
Process process = Process.Start(psi);
string errorMsg = process.StandardOutput.ReadToEnd();
process.WaitForExit();
Однако тот же код C# выдает следующий вывод об ошибке при запуске в качестве скомпилированной развернутой службы Windows:
"This action is only valid for products that are currently installed."
Дополнительные комментарии:
- Служба Windows, которая выдает команду удаления, работает на той же машине, что и код, тестируемый в режиме отладки.Служба Windows работает/вошла в систему в качестве учетной записи локальной системы.
- Я консультировался с журналами приложений, и я подтвердил, что выполненные аргументы команды одинаковы как в режиме отладки, так и в режиме выпуска.
- Я консультировался с зрителем событий, но это не предлагает никаких подсказок.
Мысли?Любая помощь будет принята с благодарностью.Спасибо.
Решение 3
Спасибо тем, кто предлагает помощь.Похоже, это проблема с разрешениями.Я обновил свою службу для работы под учетной записью администратора, и она смогла успешно удалить стороннее приложение.По мнению Ориона, хотя учетная запись «Локальная система» — это мощная учетная запись, имеющая полный доступ к системе… http://technet.microsoft.com/en-us/library/cc782435.aspx -- Кажется, у него нет необходимых прав для удаления.
[См. дополнительные комментарии для получения полной информации о возможности LocalSystem удалить приложение, для которого оно установлено.]
Другие советы
Шаг 1: Проверьте файлы журнала ошибок MSI.
Я подозреваю, что ваша проблема связана с работой от имени LocalSystem.
Учетная запись локальной системы — это не то же самое, что обычная учетная запись пользователя, имеющая права администратора.Он не имеет доступа к сети, а его взаимодействие с реестром и файловой системой совсем другое.
Из памяти любые запросы на чтение/запись в ваш «домашний каталог» или HKCU в реестре фактически переходят либо в профиль пользователя по умолчанию, либо, в случае временных каталогов, c:\windows\temp
Раньше я сталкивался с подобными проблемами при установке: клиент использовал для установки учетную запись СИСТЕМА, и это вызывало всевозможные проблемы с разрешениями для пользователей, не являющихся администраторами.
Файлы журнала MSI на самом деле не помогут, если приложение не отображается как «установленное». Я бы предложил начать с записи вывода MSIINV.EXE
под системной учетной записью вы получите «Инвентаризацию» установленных на данный момент программ (или того, что этот пользователь видит установленным) http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx
Я думаю, вам, вероятно, нужно вернуться к чертежной доске и посмотреть, действительно ли вам нужна служба Windows для удаления.Вероятно, вы столкнетесь со всевозможными проблемами UAC в Vista, если еще этого не сделали...
Это странно.LocalSystem определенно имеет права на установку приложений (именно так работают Центр обновления Windows и развертывание программного обеспечения в Active Directory), поэтому у него также должна быть возможность удалить.
Возможно, приложение изначально устанавливается для каждого пользователя, а не для каждого компьютера?
@Пол Лалонд
Установщик приложения заключен в специальный установщик InnoSetup.Установщик InnoSetup, в свою очередь, запускается вручную вошедшим в систему пользователем.Тем не менее, удаление запускается службой, работающей под учетной записью локальной системы.
Судя по всему, вы что-то задумали.Я провел быстрый тест, в ходе которого служба работала под учетной записью LocalSystem, а также удаляла приложение, и все работало безупречно.Вы были правы.Учетной записи LocalSystem необходимы разрешения на удаление приложений, в которых она устанавливается.Вы спасли положение.Спасибо за ответ!