Сбой команды удаления только в режиме выпуска - PullRequest
3 голосов
/ 11 сентября 2008

Я могу успешно удалить стороннее приложение через командную строку и с помощью специального установщика Inno Setup.

Командная строка Выполнение:

MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn

Команда Inno Setup:

[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated; 
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";

Я также могу программно удалить приложение при выполнении следующего кода C # в режиме отладки.

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, которая выпускает команда удаления запущена на та же машина, что и код протестировано в режиме отладки. Окна Служба запущена / вошла как Учетная запись локальной системы.
  • Я сверился с журналами приложений и я подтвердил, что аргументы выполненной команды одинаковые как в режиме отладки, так и в режиме выпуска.
  • Я проконсультировался с Event Viewer но он не предлагает никаких подсказок.

Мысли? Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 5 ]

2 голосов
/ 11 сентября 2008

В прошлом я сталкивался с подобными проблемами при установке, заказчик использовал для установки учетную запись SYSTEM, и это вызывало всевозможные проблемы с разрешениями для пользователей без прав администратора.

Файлы журнала MSI на самом деле не помогут, если приложение не выглядит «установленным», я бы посоветовал начать с захвата вывода MSIINV.EXE под системной учетной записью, что даст вам «Инвентарь» установленных на данный момент программ (или того, что этот пользователь видит установленным) http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

Я думаю, что вам, вероятно, нужно вернуться к чертежной доске и посмотреть, действительно ли вам нужна служба Windows для удаления. Вероятно, вы столкнетесь со всевозможными проблемами с Vista UAC, если вы еще этого не сделали ...

2 голосов
/ 11 сентября 2008

Шаг 1: Проверьте файлы журнала ошибок MSI

Я подозреваю, что ваша проблема связана с тем, что вы работаете как LocalSystem.

Локальная системная учетная запись отличается от обычной учетной записи пользователя с правами администратора. У него нет доступа к сети, и его взаимодействие с реестром и файловой системой совершенно другое.

Из памяти любые запросы на чтение / запись в ваш «домашний каталог» или HKCU в реестре фактически переходят либо в профиль пользователя по умолчанию, либо в случае временных папок, c:\windows\temp

1 голос
/ 12 сентября 2008

Спасибо тем, кто предлагает помощь. Похоже, это проблема с разрешениями. Я обновил свой сервис для работы под учетной записью администратора и смог успешно удалить стороннее приложение. По мнению Ориона, хотя локальная системная учетная запись является мощной учетной записью, которая имеет полный доступ к системе - http://technet.microsoft.com/en-us/library/cc782435.aspx - у нее, похоже, нет необходимых прав для выполнения удаления.

[См. Дополнительные комментарии для полной истории о том, что LocalSystem может удалить приложение, для которого оно установлено.]

0 голосов
/ 13 сентября 2008

@ Пол Лалонд

Установщик приложения находится в пользовательском установщике InnoSetup. Инсталлятор InnoSetup, в свою очередь, выполняется вручную вошедшим в систему пользователем. Тем не менее, удаление запускается службой, работающей под учетной записью локальной системы.

Видимо, вы были на что-то. Я собрал быстрый тест, в котором служба работала под учетной записью LocalSystem, а также удалила приложение, и все работало безупречно. Вы были правы. У учетной записи LocalSystem есть необходимые разрешения на удаление для приложений, в которые она устанавливается. Вы спасли день. Спасибо за ответ!

0 голосов
/ 12 сентября 2008

Это странно. LocalSystem определенно обладает правами на установку приложений (именно так работают Центр обновления Windows и развертывание программного обеспечения в Active Directory), поэтому он также должен иметь возможность удаления.

Возможно, приложение изначально устанавливается для каждого пользователя, а не для компьютера?

...