将MSI标记为必须以 elevated 管理员账户运行

26

我有一个CustomAction作为MSI的一部分。

它必须以域帐户身份运行,该帐户也是本地管理员帐户的成员。

它不能使用NoImpersonate标志将自定义操作作为NT Authority\System运行,因为它将无法访问网络资源。

在启用UAC的Vista/2008上,如果关闭了NoImpersonate,则它将作为执行用户运行,但具有非特权令牌,并且无法访问本地资源,例如.installState。请参阅UAC架构

有人知道以下哪种方法可以:

  • 强制MSI以相同方式使用提升的标记运行,就像从提升的命令提示符中运行一样?

  • 强制CustomAction运行时提升(manifest中的requireAdministrator似乎不起作用)?

  • 确定是否启用了UAC,如果还没有提升,则警告或取消安装?

3个回答

34

回答自己的问题,以帮助其他遇到该问题的人。

  • 无法向MSI添加清单。您可以添加SETUP.EXE或引导程序以调用MSI并要求管理员权限来搭配使用清单,但这会削弱使用MSI的某些优点。

  • 无法向CustomAction添加清单,因为它是从msiexec.exe运行的。

我解决此问题的方法是将MSIUSEREALADMINDETECTION属性设置为1,这样特权条件才能正常工作,并为Privileged添加启动条件,提示需要通过提升了的命令提示符运行安装程序,然后退出安装。

这样做还有一个好处是,当从提升了的命令提示符运行msi时,延迟的CustomActions将作为当前用户以完整管理员令牌(而不是标准用户令牌)运行,无论设置如何,详情请参见NoImpersonate

更多细节请参见http://www.microsoft.com/downloads/details.aspx?FamilyID=2cd92e43-6cda-478a-9e3b-4f831e899433

[编辑] - 我在这里放了一个脚本,让您添加MSIUSEREALADMINDETECTION属性,因为VS无法执行此操作,而Orca则很麻烦。


5
如果我有足够的声望,我会将"设置MSIUSEREALADMINDETECTION属性"编辑为"将MSIUSEREALADMINDETECTION属性设置为1",这样读者就能获得信息而不必跟随链接。 - Fabien
MSIUSEREALADMINDETECTION 的十六进制值是多少?还是你只是设置 MSIUSEREALADMINDETECTION?我问这个问题的原因是,当我运行脚本时,它总是进入 else 块并添加一个新属性。此外,我的安装程序似乎仍在以系统帐户而不是用户帐户下运行。 - Dhawalk
@Ryan 在 Windows Installer 3.1 及更早版本中不受支持。 - antonio

1

在清单中使用requireAdministrator应该可以正常工作。

您还可以使用一个引导程序.exe文件,该文件可以使用ShellExecute并将"RUNAS"作为动词(您可以使用7-zip创建引导程序,或者有许多其他方法)。


1
我原以为只能将清单添加到 .EXE 文件中,而不能添加到 MSI 文件中。我已经将清单添加到自定义操作的 .EXE 文件中,但似乎不起作用,可能是在 msiexec 下运行的副作用? - Ryan

0

您可以使用Winrar和以下选项创建一个简单的sfx归档文件,用于msi文件:

  • 设置选项卡 > 执行后运行输入:您的msi文件名称

  • 高级选项卡 > 标记请求管理员访问选项复选框


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