在延迟模式下运行 CustomAction 时,我遇到了一些权限问题。
我想杀死一些可能使用不同用户帐户运行的服务进程,从本地系统到普通用户,但只有当进程和 CA 以同一用户身份执行时,CA 才会成功。以下是一些案例和结果:
- “process1.exe”是一个以运行安装的同一用户身份运行的进程。如果 kill CA 在 System context 中使用 Impersonate="no" 运行,则访问被拒绝。
- “process1.exe”是一个以运行安装的同一用户身份运行的进程。如果 kill CA 使用 Impersonate="yes" 在用户上下文中运行,则该进程被kill 。
- “process1.exe”是作为另一个用户运行的进程。如果 kill CA 在用户上下文中使用 Impersonate="yes" 运行,则访问被拒绝。
- “process1.exe”是作为另一个用户运行的进程。如果 kill CA 在系统上下文中使用 Impersonate="no" 运行,则访问被拒绝
- “process1.exe”是作为本地系统运行的进程。如果 kill CA 在用户上下文中使用 Impersonate="yes" 运行,则访问被拒绝。
- “process1.exe”是作为本地系统运行的进程。如果 kill CA 在 System context 中使用 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 运行时才会遇到这些问题。
是否可以将自定义操作作为系统杀死进程运行,而不是仅由系统拥有?