我在运行CustomAction时遇到一些特权问题 延期模式。
我想杀死一些可能正在运行的服务进程 不同的用户帐户,从本地系统到普通用户,但是CA. 仅当进程和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.
如果LocalSystem没有权利杀死进程,谁呢? 从命令提示符运行这些命令时没有问题 升高。 甚至使用SysInternal的psexec来运行命令作为系统工作 没问题。只有在通过MSI运行时才会遇到这些问题。
是否可以将自定义操作作为系统终止进程运行 不仅仅由System拥有?
答案 0 :(得分:0)
这个问题标记为DTF,但我没有看到任何.NET代码。
FWIW,我已经搜索了这个主题并且推测它太多了......现实是你需要一把更大的锤子而C#/ DTF就是锤子。您可以使用它进行更复杂的API调用以及更好的错误处理/日志记录。