如何自动测试是否可以通过UAC安装MSI?

时间:2019-02-20 21:42:45

标签: wix windows-installer msiexec

我想验证普通用户是否可以安装MSI。有没有任何方法可以在没有图形提示的情况下使用UAC模拟安装的权限流?

背景:

我使用的是通过MSI在Windows上分发的应用程序。我们通过运行msiexec并对其进行测试,然后测试结果应用程序。可行,但是我们最近遇到了一个无法覆盖的极端情况。

我们最近在wix设置中添加了CustomAction,它在安装结束时运行,并且需要提升的权限才能运行。问题是CustomAction默认情况下以Impersonate="yes"运行,这意味着它们以运行用户的权限而不是UAC授予的提升的权限运行。

在我们的测试中,我们从管理员上下文运行,因此安装成功。但是,典型用户将需要UAC提示来授予MSI临时管理员安装权限。由于自定义操作未在该管理上下文中运行,因此安装失败。

因此,我想做的是建立一个自动测试环境,以更紧密地模拟用户体验。 UAC通常设计为出于安全原因不编写脚本,这使问题变得更加复杂。因此,我想知道的是,考虑到我对环境的完全控制,是否可以通过一种可自动化的方式来行使权限流。

1 个答案:

答案 0 :(得分:0)

高权限 :每台计算机的安装程序都可以使用临时管理员权限(如您所说)运行,而无需按用户安装。这是通过可以正确处理这种情况的组策略/ Active Directory和分发系统完成的。

模拟提升的权限 :要在普通PC(无分配系统)上模拟提升的权限,可以使用组策略 /名为AlwaysInstallElevated的注册表黑客。一旦应用,这实际上意味着所有用户只需启动MSI即可以提升的权限运行。相当大的安全漏洞,所以请不要使用它来娱乐。但是,您可以启动任何安装并以提升的权限进行安装-如果需要的话。

延迟模式自定义操作 :仅延迟模式自定义操作具有提升的权限。即时模式自定义操作无法提升,如果它们尝试对需要管理员权限的系统执行某些操作,则将出现运行时错误。如果您使用“真实”管理员权限运行这样的MSI失败,则您会看到MSI似乎已成功安装(尽管对于标准用户,它会因权限提升而失败)。

通常(出于非平凡目的)实施延迟模式自定义操作需要一些相关步骤。也许您熟悉它们?您无法直接访问属性,需要通过称为CustomActionDataSO)的机制“将它们发送到延迟模式”。还有adding a marginal WiX sample for deferred mode

现在为您提供一些链接(太多,但只是想我会帮您的忙-我认为第一个链接会做到,经典技术文章5个,使用JSON的现代方法6个):


特权 :如果您要确保MSI软件包为标准用户正确安装每台计算机,我会向MSI添加启动条件以在以下情况下中止运行:特权不可用(没有成功的机会)。请注意,这不是检查管理员权限,而是检查特权(提升的权限)。

<Condition Message="Elevated rights required to install package.">Privileged</Condition>

msiexec.exe :仅作记录用途,添加少量批处理以检查msiexec.exe error codes(最近未测试,但是请注意-数字或错误代码表示成功-例如“ 重启启动”之类的东西:

1603 = Fatal error。有关更多信息,请参见上面的链接。

start /wait msiexec.exe /i Setup.msi /l*v Setup.log

if "%errorlevel%" == "0" goto OK
if "%errorlevel%" == "1603" goto err
if not "%errorlevel%" == "0" goto err

:OK
GOTO END

:err
rem print message and return errorlevel
echo "Error: Msiexec failed with errorlevel = %errorlevel%"
exit /b %errorlevel%

:END

请注意,许多退出代码表示成功(不只是0):

1641: ERROR_SUCCESS_REBOOT_INITIATED
3010: ERROR_SUCCESS_REBOOT_REQUIRED

也许我忘记了其他人。仅示例。