Windows Inno安装程序:无管理员权限卸载

Windows Inno安装程序:无管理员权限卸载,windows,inno-setup,uninstallation,Windows,Inno Setup,Uninstallation,使用Inno安装程序,我需要管理员用户安装的软件可以由默认用户卸载 参数PrivilegesRequired是最低的,但问题仍然存在 我在一些机器上做了测试(都是Windows 7),在一些机器上我可以使用默认用户卸载,但还有一些机器不允许我卸载,并请求管理员用户 我没有发现问题和网络搜索的模式 安装文件夹为C:\ 我没有使用[Registry]部分,而[Dirs]部分中的所有参数都在使用权限:用户修改需要考虑以下几点: 通常,安装文件夹为%ProgramFiles%或%ProgramFiles

使用Inno安装程序,我需要管理员用户安装的软件可以由默认用户卸载

参数
PrivilegesRequired
最低的
,但问题仍然存在

我在一些机器上做了测试(都是Windows 7),在一些机器上我可以使用默认用户卸载,但还有一些机器不允许我卸载,并请求管理员用户

我没有发现问题和网络搜索的模式


安装文件夹为C:\


我没有使用
[Registry]
部分,而
[Dirs]
部分中的所有参数都在使用
权限:用户修改

需要考虑以下几点:

  • 通常,安装文件夹为%ProgramFiles%或%ProgramFiles(x86)%2,这是一个受操作系统保护的文件夹。若要绕过此保护,安装程序必须更改安装文件夹的权限,以允许任何人删除

    在该部分中,您可以使用
    权限:用户修改
    (如果需要,甚至可以使用更大的权限)

  • 本节也类似

  • InnoSetup使用名为
    unins000.exe的文件进行卸载。此文件包括一个清单,默认情况下,该清单请求特权
    asInvoker
    。据我所知,这不会随着
    PrivilegesRequired
    设置而改变。到目前为止,
    asInvoker
    应该还可以。请密切关注它,以防新版本的InnoSetup会将其设置为更高的值


  • 对于发现此问题而未使用InnoSetup的其他访问者:


    如果您没有在安装程序中嵌入清单,Windows将使用。如果启发式结果为肯定结果,Windows将自动请求管理员提升。因此,使用清单并请求asInvoker
    权限。

    如果安装程序是以管理员或超级用户权限运行的,Inno安装卸载程序会请求权限提升(无论是否需要那些明确具有
    权限的权限)

    该信息存储在
    unins000.dat
    的字节14C(十六进制)/322(十进制)中

    它是位掩码,其中位1(0x01)表示管理员权限,位7(0x40)表示超级用户权限[已过时]


    因此,如果您以管理员/超级用户的身份安装应用程序,即使安装程序具有
    PrivilegesRequired=lower
    权限,卸载程序也会请求提升权限以获得相同的权限。检查
    unins000.dat
    中的标志,查看是否存在这种情况


    另一件事是,在Windows 10中,如果您从设置应用程序(而不是从控制面板)启动卸载程序,它将始终以管理员权限启动:

    非管理员无权访问Program Files文件夹,因此如果程序安装在该文件夹中,那么您就是在请求不可能的解决方法。@MarkRansom:如果安装程序在安装过程中更改了权限,则不应使用此选项,对吗?我已经做了一些测试,并且它已经工作了,但是有些机器我无法卸载软件。软件放在C目录下。嗯,你是怎么卸载的?通过InnoSetup的unins000.exe或通过控制面板?可能这两种方式都有差异,我卸载的结果是一样的。安装文件夹是C:\,我没有使用[Registry]部分,[Dirs]部分中的所有参数都使用权限:用户修改。我已经做了一些测试,它工作了,但有些机器我无法卸载软件,所以我认为有一个场景我没有考虑。@RobsonPiernodeJesus:这是你应该添加到问题中的重要信息。这些信息仍然相关吗?我签入了我的unins000.dat字节14C的值为0x25(0010 0101)。我将其设置为0x24(0010 0100),然后得到错误消息unins000.dat已损坏。我做错了什么?好的,在github的源代码中找到了丢失的信息-我们必须用计算出的CRC32更新从字节444(dec)开始的CRC字节,或者只是设置为0x11111111(神奇调试值),我这样做了,卸载程序没有要求提升。