2

在延迟模式下运行 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 运行时才会遇到这些问题。

是否可以将自定义操作作为系统杀死进程运行,而不是仅由系统拥有?

4

1 回答 1

0

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

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

于 2017-07-25T01:29:52.033 回答