系统上下文中的延迟CustomAction被拒绝访问

时间:2017-05-09 09:21:30

标签: wix windows-installer custom-action dtf

我在运行CustomAction时遇到一些特权问题 延期模式。

我想杀死一些可能正在运行的服务进程 不同的用户帐户,从本地系统到普通用户,但是CA. 仅当进程和CA作为同一用户执行时才会成功。 以下是一些案例和结果:

  • " process1.exe"是一个正在运行的同一个用户运行的进程 安装。如果kill CA在System上下文中运行使用 冒充="无" 访问被拒绝
  • " process1.exe"是一个正在运行的同一个用户运行的进程 安装。如果使用在用户上下文中运行kill CA. 冒充="是" 进程被杀死
  • " process1.exe"是另一个用户运行的进程。如果杀死CA. 使用Impersonate =" yes"在用户上下文中运行访问被拒绝
  • " process1.exe"是另一个用户运行的进程。如果杀死CA. 使用Impersonate =" no"在系统上下文中运行访问被拒绝
  • " process1.exe"是一个作为本地系统运行的进程。如果杀死CA. 使用Impersonate =" yes"在用户上下文中运行访问被拒绝。
  • " process1.exe"是一个作为本地系统运行的进程。如果杀死CA. 使用Impersonate =" no"在系统上下文中运行这个过程是 杀死。
<SetProperty Id="KillUserProcess" Value='"[WindowsFolder]\System32\taskkill.exe" /F /IM process1.exe' After="CostFinalize" />
<CustomAction Id="KillUserProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />

<SetProperty Id="KillSysProcess" Value='"[WindowsFolder]\System32\taskkill.exe" /F /IM process2.exe' After="CostFinalize" />
<CustomAction Id="KillSysProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />

<InstallExecuteSequence>
    <Custom Action="KillUserProcess" After="InstallInitialize"></Custom>
    <Custom Action="KillSysProcess" After="KillUserProcess"></Custom>
</InstallExecuteSequence>

Action=KillUserProcess,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="C:\Windows\System32\taskkill.exe" /F /IM process1.exe) CAQuietExec: "C:\Windows\System32\taskkill.exe" /F /IM process1.exe CAQuietExec: ERROR: The process "process1.exe" with PID 3164 could not be terminated. CAQuietExec: Reason: Access is denied. CAQuietExec: CAQuietExec: Error 0x80070001: Command line returned an error. CAQuietExec: Error 0x80070001: QuietExec Failed CAQuietExec: Error 0x80070001: Failed in ExecCommon method

Action=KillSysProcess,ActionType=3137,Source=BinaryData,Target=CAQuietExec,CustomActionData="C:\Windows\System32\taskkill.exe" /F /IM process2.exe) CAQuietExec: "C:\Windows\System32\taskkill.exe" /F /IM process2.exe CAQuietExec: SUCCESS: The process "process2.exe" with PID 4596 has been terminated.

如果LocalSystem没有权利杀死进程,谁呢? 从命令提示符运行这些命令时没有问题 升高。 甚至使用SysInternal的psexec来运行命令作为系统工作 没问题。只有在通过MSI运行时才会遇到这些问题。

是否可以将自定义操作作为系统终止进程运行 不仅仅由System拥有?

1 个答案:

答案 0 :(得分:0)

这个问题标记为DTF,但我没有看到任何.NET代码。

FWIW,我已经搜索了这个主题并且推测它太多了......现实是你需要一把更大的锤子而C#/ DTF就是锤子。您可以使用它进行更复杂的API调用以及更好的错误处理/日志记录。