Проблема удаления с обычным пользователем 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;