返回

从“用户/此帐户”服务启动非零会话中进程:详解常见问题与解决方案

windows

启动非零会话中进程:使用“用户/此帐户”服务

问题

你有一个以“用户/此帐户”身份运行的服务 (winrshost.exe)。该服务在会话 0 中运行,并使用子进程启动了另一个进程“myproc1.exe”,也在会话 0 中运行。

现在,你想在其他非零会话中启动另一个子进程“myproc2.exe”。这是否可行?

背景

目前,网上讨论该主题的所有链接都针对“系统”帐户中的服务。然而,你的服务是以“用户/此帐户”身份运行的。

尝试的解决方案

你尝试了以下方法来更改会话 ID:

  • 方法 1:更改 TokenSessionId

    • 调用 SetTokenInformation API 成功更改了 TokenSessionId。
    • 调用 CreateProcessAsUserW API 失败,错误为 '5' (ERROR_ACCESS_DENIED)。
  • 方法 2:不更改 TokenSessionId

    • 进程在会话 0 中启动。

问题原因

方法 1

  • 服务是以“用户/此帐户”身份运行的。
  • 你没有获得更改会话 ID 所需的权限。

方法 2

  • 进程在会话 0 中启动。

可能的解决方案

尝试 1:修改服务权限

  • 确保你的服务具有以下权限:
    • 调试权限
    • 调整会话 ID 的权限
  • 在提升的命令提示符中,运行以下命令:
sc config "你的服务名称" debug

尝试 2:使用 Windows 附加服务 API

  • 在你的服务中使用 Windows 附加服务 API。
  • 这些 API 可以让你访问更广泛的权限,包括更改会话 ID。

限制

  • 使用此方法有一些限制:
    • 服务必须以“本地系统”帐户运行。
    • 进程只能在本地计算机上启动。

注意事项

  • 修改服务权限或使用 Windows 附加服务 API 可能需要对你的系统进行高级更改。
  • 在做出任何更改之前,请仔细考虑潜在的风险并咨询合格的 IT 专业人员。

结论

启动非零会话中的进程时,以“用户/此帐户”身份运行的服务面临独特的挑战。通过修改服务权限或使用 Windows 附加服务 API,你可以克服这些挑战并获得启动非零会话中进程所需的权限。

常见问题解答

  1. 我需要使用什么方法才能启动非零会话中的进程?
    • 使用方法 1 或方法 2,具体取决于你的服务权限和对进程启动位置的限制。
  2. 使用 Windows 附加服务 API 有什么限制?
    • 服务必须以“本地系统”帐户运行,进程只能在本地计算机上启动。
  3. 是否需要重启服务才能应用权限更改?
    • 是,在修改服务权限或使用 Windows 附加服务 API 之后,需要重启服务才能应用更改。
  4. 我是否可以从非零会话中终止会话 0 中的进程?
    • 可以,但需要获得 SE_TCB_NAME 和 SE_ASSIGNPRIMARYTOKEN_NAME 特权。
  5. 是否可以通过其他方式启动非零会话中的进程?
    • 是,还有其他方法,例如使用 Windows 管理工具箱或第三方库。