标准Windows用户的卸载程序问题

时间:2017-12-24 18:40:10

标签: inno-setup uninstall privilege-elevation

我想知道我是否遇到了与this post中讨论的Windows 10相同的错误。

我在卸载没有标高的标准用户安装的程序时出现问题。

我正在使用INNO安装程序,因此我有PrivilegesRequired =最低,并且INNO不提示提升权限,并为当前用户安装,并创建卸载程序,例如uninst000.exe,在我的应用程序文件夹中,我有INNO在我的应用程序的“开始菜单”组中为卸载程序添加了一个图标(所有这些都是为当前用户完成的)。 INNO还在“设置/应用”和“设置”中添加了一个项目。 Windows 10的功能小程序(这是问题所在的地方)。

如果从“开始”菜单图标启动卸载程序,则不会提示提升权限,我的应用程序可以毫无问题地卸载。

如果卸载程序是从Apps& amp;将显示功能,提示提升权限,如果输入了管理员凭据(它们必须是),则不会正确卸载应用程序。有些东西是卸载的,但不是一切。删除了应用程序文件,并删除了开始菜单组,但INNO的[UninstallRun]部分中的其他清理操作无法完成。此外,不会从Apps&中的列表中删除卸载项目。特征

所以我的问题是,这是由早期帖子中提到的Windows 10错误造成的吗?

1 个答案:

答案 0 :(得分: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;