具有提升权限的 WiX CustomAction SCHTASKS“拒绝访问”

Posted

技术标签:

【中文标题】具有提升权限的 WiX CustomAction SCHTASKS“拒绝访问”【英文标题】:WiX CustomAction with elevated privileges SCHTASKS "Access Denied" 【发布时间】:2016-08-31 18:01:22 【问题描述】:

我的安装程序当前将一些文件安装到一个目录,然后执行一些 CustomAction 脚本来创建 2 个名为 Script1 和 Script2 的计划任务。

我还有另外 2 个名为 RemoveScript1 和 RemoveScript2 的 CustomAction 脚本。

它们都是相同的 34 型 CA,具有以下属性:

<CustomAction Id="XXXXXX"
              Directory="AFolder"
              ExeCommand="XXXXXX"
              Execute="deferred"
              Impersonate="no"
              Return="asyncWait" />

以及以下安装顺序。

<InstallExecuteSequence>
  <Custom Action="RemoveScript1" Before="InstallFinalize" >REMOVE="ALL"</Custom>
  <Custom Action="RemoveScript2" Before="InstallFinalize" >REMOVE="ALL"</Custom>
  <Custom Action="Script1" Before="InstallFinalize" >(NOT Installed) OR MaintenanceMode="Modify"</Custom>
  <Custom Action="Script2" Before="InstallFinalize" >(NOT Installed) OR MaintenanceMode="Modify"</Custom>
</InstallExecuteSequence>

示例创建脚本:

SCHTASKS.exe /Create /TN NAME /TR "pathtosomeexe" /SC ONEVENT /EC System /MO *[System/EventID=XXXX] /F

删除脚本示例:

SCHTASKS /Delete /TN NAME /F

创建脚本执行良好,但删除脚本似乎不起作用。检查日志时,我看到以下与 RemoveScriptX 相关的行。

MSI (s) (60:B0) [17:20:49:555]:执行操作:RemoveScript1 动作开始时间 17:20:49:RemoveScript1。 操作于 17:20:49 结束:RemoveScript1。返回值 1。 MSI (s) (60:B0) [17:20:49:649]:执行操作:ActionStart(Name=RemoveScript1,,) MSI (s) (60:B0) [17:20:49:649]:执行操作:CustomActionSchedule(Action=RemoveScript1,ActionType=3234,Source=AFolder,Target=C:\Windows\SysWOW64\SCHTASKS。 exe /Delete /TN NAME /F,) 1:删除脚本1 2:1631

当我尝试使用普通命令行删除安装程序创建的这些脚本时,我收到“错误:访问被拒绝”。 .太棒了!这意味着计划任务是由管理员创建的。我可以按预期使用管理命令行删除任务。

如果我使用普通命令行创建任务,我可以按预期正常删除它。

我应该注意我已经尝试过 InstallScope = perMachine 和 perUser。唯一的区别似乎是我必须以管理员身份运行实际的安装程序,以便 perUser 访问 ProgramFiles 目录以安装其他文件。

为什么我的删除脚本没有使用管理员/提升权限? 我错过了什么愚蠢的事情吗? 我曾假设“1631”是从 SCHTASKS.exe 返回的错误代码,如果我错了,请纠正我。

操作系统:Windows 10

Wix 版本:3.10

【问题讨论】:

一开始你是如何创建任务的?错误可能是您试图从系统上下文中删除不包含该任务的任务,因为它是在安装期间在用户的上下文中创建的。如果你把 /RU "SYSTEM" 放在你的 SCHTASKS /CREATE 中,它可能会解决这个问题。 我刚试过这个。该任务仍会创建,但不会删除。但是,如果没有 /RU "SYSTEM",这些任务似乎不会使用 "perMachine" 创建。 不确定当时的解决方案是什么,这只是一个猜测。看起来 C:\windows\tasks\schedlgu.txt 中有 schtasks 的日志,如果它们存在,它们可能会更清楚地说明这个问题。我认为错误 1631 只是一个通用的自定义操作失败错误。 不幸的是,这些日志不存在。明天我会再试一次,并相应地更新我的帖子。 【参考方案1】:

这可能不是理想的答案,但这是我解决问题的方法。

而不是使用如下参数调用 SCHTASKS:

[SystemFolder]SCHTASKS.exe /Create /TN TASKNAME

我改为调用 POWERSHELL,给出 SCHTASKS 及其参数如下:

[POWERSHELLEXE] &amp; SCHTASKS /Create /TN TASKNAME

当我继续使用 WiX QtExec http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html 时,我无法发布用于 powershell 版本的确切代码。

它需要将脚本放入属性“Value”而不是原始问题中使用的“ExeCommand”,并且每个格式都略有不同。

【讨论】:

以上是关于具有提升权限的 WiX CustomAction SCHTASKS“拒绝访问”的主要内容,如果未能解决你的问题,请参考以下文章

Wix Bootstrapper 清单或提升的自定义操作

WiX CustomActionData 在调用的 CustomAction 中为空

Wix:无法从Wix CustomAction调用DISM

从对话框调用 CustomAction 时出现 WiX 安装错误 2762

wix customaction UAC dtf

使用管理员权限在 Wix msi 中运行 .exe