【问题标题】:Deferred CustomAction in System context get access denied系统上下文中的延迟自定义操作被拒绝访问
【发布时间】: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 &lt;service name&gt; 而不是taskkill 来停止您的服务
  • 停止服务是我做的第一件事,我拥有的实际 CustomAction 更高级,它指示服务管理器停止服务,它解析服务的所有进程并等待进程 60 秒关闭。但是进程有时会崩溃并且它们不会关闭,并且服务管理器会一直试图停止服务。释放所有锁的唯一方法是终止进程。这就是问题出现的地方,即使在“系统”上下文中运行时也没有杀死进程的权限。

标签: wix windows-installer custom-action dtf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2023-03-05
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多