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

问题描述:

我在 延迟模式下运行CustomAction时遇到一些特权问题。系统上下文中延迟的CustomAction获取访问被拒绝

我想杀死一些可能使用 不同的用户帐户从本地系统运行到普通用户的服务进程,但是只有当进程和CA作为同一用户执行时才能成功。 这里有一些情况和结果:

  • “process1.exe”是运行的运行 安装相同的用户的过程。如果kill CA在系统上下文中使用 Impersonate =“no”运行,则访问被拒绝
  • “process1.exe”是一个作为运行 安装的相同用户运行的进程。如果kill CA在用户上下文中使用 Impersonate =“yes”运行,则进程将被终止
  • “process1.exe”是作为另一用户运行的进程。如果在用户上下文中使用Impersonate =“yes”运行杀死CA ,则访问被拒绝
  • “process1.exe”是作为另一用户运行的进程。如果在系统上下文中使用Impersonate =“no”运行杀死CA ,则拒绝访问
  • “process1.exe”是作为本地系统运行的进程。如果在用户上下文中使用Impersonate =“yes”运行杀死CA ,则访问被拒绝。
  • “process1.exe”是作为本地系统运行的进程。如果在系统上下文中使用Impersonate =“no”运行杀死CA ,则处理为 死亡。
<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.

如果本地系统没有杀过程的权利,谁呢? 当提升 时,从命令提示符运行这些命令没有任何问题。 即使使用SysInternal中的psexec作为系统工作 运行命令没有问题。只有在通过MSI运行时才会遇到这些问题。

是否有可能使自定义操作作为系统kill进程运行 不仅仅由System拥有?

+0

我第一眼看不到错误,但也许你可以尝试用sc stop 而不是'taskkill'来停止你的服务。 – linuxrocks

+0

停止服务是我做的第一件事,实际的CustomAction在指示服务管理器停止服务时,我已经更先进了,它解决了服务的所有进程,并等待60秒关闭进程。但有时进程崩溃,他们不关闭,服务经理停止尝试停止服务。释放所有锁的唯一方法是终止进程。这就是问题出现的地方,即使在“系统”环境中运行,缺乏杀死进程的权限。 – IlirB

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

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