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

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

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

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

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

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

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

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;
Другие вопросы по тегам