【发布时间】:2017-05-09 09:21:29
【问题描述】:
我在运行 CustomAction 时遇到了一些权限问题 延迟模式。
我想杀死一些可能正在运行的服务进程 不同的用户帐户,从本地系统到普通用户,但 CA 仅当进程和 CA 以同一用户身份执行时才会成功。 以下是一些案例和结果:
- “process1.exe”是一个以同一用户身份运行的进程 安装。如果 kill CA 在系统上下文中运行,使用 Impersonate="no" 访问被拒绝。
- “process1.exe”是一个以同一用户身份运行的进程 安装。如果 kill CA 在用户上下文中运行,使用 Impersonate="yes" 进程被杀死。
- “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 运行时才会遇到这些问题。
是否可以使自定义操作作为系统终止进程运行 不只归系统所有?
【问题讨论】:
-
乍一看我看不出有什么错误,但也许您可以尝试使用
sc stop <service name>而不是taskkill来停止您的服务 -
停止服务是我做的第一件事,我拥有的实际 CustomAction 更高级,它指示服务管理器停止服务,它解析服务的所有进程并等待进程 60 秒关闭。但是进程有时会崩溃并且它们不会关闭,并且服务管理器会一直试图停止服务。释放所有锁的唯一方法是终止进程。这就是问题出现的地方,即使在“系统”上下文中运行时也没有杀死进程的权限。
标签: wix windows-installer custom-action dtf