Проблемы с деинсталлятором со стандартным пользователем Windows

Мне интересно, сталкиваюсь ли я с той же ошибкой в ​​​​Windows 10, которая обсуждалась в этот пост.

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

Я использую INNO Setup, поэтому у меня PrivilegesRequired = самый низкий, и INNO не запрашивает повышенные привилегии, устанавливает для текущего пользователя и создает программу удаления, например. uninst000.exe в папке моего приложения, и я INNO поместил значок для деинсталлятора в группу меню «Пуск» для моего приложения (все это сделано для текущего пользователя). INNO также добавляет элемент в апплет «Настройки/Приложения и функции» Windows 10 (вот где возникает проблема).

Если программа удаления запускается с помощью значка меню «Пуск», запроса на повышенные привилегии не появляется, и мое приложение удаляется без проблем.

Если программа удаления запускается из приложений и функций, появляется запрос на повышенные привилегии, и если введены учетные данные администратора (а они должны быть), приложение не удаляется правильно. Некоторые вещи удаляются, но не все. Файлы приложения удаляются, и группа меню «Пуск» удаляется, но дополнительные действия по очистке в разделе INNO [UninstallRun] не выполняются. Кроме того, элемент «Удалить» не удаляется из списка в «Приложения и функции».

Итак, мой вопрос: это вызвано ошибкой Windows 10, упомянутой в предыдущем посте?


person user3142056    schedule 24.12.2017    source источник
comment
Я действительно могу воспроизвести проблему. В качестве обходного пути вы можете заставить программу удаления определить, что она запущена с повышенными правами, в то время как программа установки была запущена без повышенных прав, и отобразить инструкции по правильному запуску.   -  person Martin Prikryl    schedule 24.12.2017
comment
Я последовал вашему предложению, чтобы программа удаления проверяла привилегии, под которыми она работает, и проверяла, находится ли ключ удаления в области реестра HKLM или HKCU.   -  person user3142056    schedule 26.12.2017


Ответы (1)


Я последовал предложению @MartinPrikryl, чтобы программа удаления (т.е. InitializeUninstall) проверяла привилегию, под которой она работает, и проверяла, находится ли ключ удаления в области реестра HKLM или HKCU. Пока мои тесты показывают, что это работает хорошо.

function IsRegularUser(): Boolean;
begin
    Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn);
end;

function WasInstalledAsStandardUser(): Boolean; //return true if uninstall key is in Current User area of registry
var
    sUnInstPath: String;
    sUnInstallString: String;
begin
    sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppName")}_is1');
    sUnInstallString := '';
    Result := True;
    { only one of these keys should be present, but if both are, return True for nonadmin }
    if RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then Result:=False;
    if RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString) then Result:=True;
end;

function InitializeUninstall: Boolean;
begin
    if WasInstalledAsStandardUser() and (Not IsRegularUser) then begin
        MsgBox( MyApp was installed with standard user rights, so it must be uninstalled with stardard user rights.'#13'  So use Start/All Programs/MyApp/Uninstall.', mbInformation, MB_OK);
        Result:=False; exit;
    end;
    Result := True;
end;
person user3142056    schedule 26.12.2017