如何自动测试MSI可以使用UAC进行安装?

问题描述 投票:1回答:1

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

背景:

我使用通过MSI在Windows上分发的应用程序。我们通过运行msiexec然后测试生成的应用程序来对其进行自动化测试。这是有效的,但我们最近遇到了一个它没有涵盖的边缘情况。

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

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

所以我想要做的是建立一个自动化的测试环境,更贴近地模拟用户体验。 UAC通常设计为出于安全原因而不编写脚本,这使问题复杂化。所以我想知道是否有任何方法以可自动化的方式行使权限流,因为我可以完全控制环境。

wix windows-installer msiexec
1个回答
0
投票

提升权利:每台计算机设置可以使用临时管理权限运行 - 正如您所说 - 不是每用户安装。这是通过组策略/ Active Directory和正确处理此类场景的分发系统完成的。

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

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

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

现在就把你的一些链接丢了(太多了,但只是想我会把你们当作一堆 - 我认为第一个链接会做,5个用于经典技术文章,6个用于使用JSON的现代方法):


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

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

msiexec.exe:只是为了记录,添加一个小批量来检查msiexec.exe error codes(最近没有测试过,但是请注意,数字或错误代码表示成功 - 例如“rebo​​ot initiated”和类似的东西):

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

可能还有其他我忘了。仅限样品。

© www.soinside.com 2019 - 2024. All rights reserved.