Inno Setup: 无需管理员权限卸载

6
使用Inno Setup,我需要管理员用户安装的软件可以被默认用户卸载。
参数PrivilegesRequiredlowest,但问题仍然存在。
我在一些机器上进行了测试(所有这些机器都是Windows 7),在其中一些机器上,我可以使用默认用户卸载,但有些机器不允许我卸载并要求管理员用户。
我没有在问题和互联网搜索中找到规律。
安装文件夹为C:\;
我没有使用[Registry]部分,并且[Dirs]部分中的所有参数都使用Permissions: users-modify

非管理员没有访问程序文件夹的权限,因此如果程序安装在那里,那么你所要求的是不可能的。 - Mark Ransom
@MarkRansom:如果安装过程中更改了权限,那么这个应该不适用,对吧? - Thomas Weller
我已经进行了一些测试,它们都成功了,但是有些机器无法卸载该软件。该软件位于C目录中。 - Robson Pierno de Jesus
嗯,你是怎么卸载的?通过InnoSetup的unins000.exe还是通过控制面板?也许有所不同。 - Thomas Weller
2
我两种方式都卸载了,结果是一样的。 - Robson Pierno de Jesus
2个回答

0

需要考虑以下几点:

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

    [Dirs] 部分中,您可以使用 Permissions:users-modify(如果需要,甚至可以更加宽松)。

  2. [Registry] 部分同理。

  3. InnoSetup 使用一个名为 unins000.exe 的文件进行卸载。该文件包含一个清单,其中默认请求特权 asInvoker。据我所知,这不会随着 PrivilegesRequired 设置的更改而改变。到目前为止,asInvoker 应该没问题。只需注意一下,以防 InnoSetup 的新版本将其设置为更高的值。


对于其他访问者,如果没有使用InnoSetup:

如果您没有在安装程序中嵌入清单文件,Windows将使用安装程序检测启发式算法 (Microsoft, .pptx)。如果启发式算法结果为正,则Windows将自动请求管理员权限。因此,请使用清单文件并请求asInvoker权限。


1
安装文件夹为C:\,我没有使用[Registry]部分,所有[Dirs]部分的参数都使用权限:users-modify。 - Robson Pierno de Jesus
我已经进行了一些测试,而且已经成功运行了。但是有些机器无法卸载软件,因此我认为可能存在一些我没有考虑到的情况。 - Robson Pierno de Jesus
@RobsonPiernodeJesus:这是你应该添加到问题中的重要信息。 - Thomas Weller

0

Inno Setup 卸载程序会请求权限提升,如果安装程序是以管理员或电源用户权限运行的(无论是否使用 PrivilegesRequired 显式要求这些权限)。

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

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


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


另一件事是,在Windows 10中,如果您从“设置”应用程序(而不是从控制面板)启动卸载程序,则始终会以管理员权限启动:
解决Windows 10中“应用和功能”启动单用户卸载程序的提升问题

1
这些信息还有效吗?我在我的unins000.dat中检查了字节14C的值为0x25(0010 0101)。我将其设置为0x24(0010 0100),然后收到错误消息,指出unins000.dat已损坏。我做错了什么? - Nick Bilak
1
好的,在 Github 上找到了源代码中缺失的信息 - 我们需要更新从第 444 字节(十进制)开始的 CRC 字节,可以用计算得到的 CRC32 值或者直接设置为 0x11111111(神奇调试值)。我已经进行了相应操作,卸载程序不再要求提权。 - Nick Bilak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接