【问题标题】:Windows CreateProcess as Local SystemWindows CreateProcess 作为本地系统
【发布时间】:2018-05-10 19:44:56
【问题描述】:

我有一个作为本地系统运行的服务。我正在使用 CreateProcess 函数来调用外部 .exe。调用 CreateProcess 函数时使用的默认帐户是什么?我在 MSDN 文档中的默认帐户上找不到任何内容。另外,我希望这个过程一直持续到时间服务运行为止。我应该使用 CreateService 吗?

【问题讨论】:

  • 而CreateService只是在服务配置数据库中创建一个条目,并没有实际运行服务。
  • 没有使用任何默认帐户。 CreateProcess 使用父进程令牌创建进程(您的当前或由PROC_THREAD_ATTRIBUTE_PARENT_PROCESS 设置)
  • 并且进程将是持久的,因为您在服务终端会话中运行它

标签: winapi windows-services local-system-account


【解决方案1】:

CreateProcess 创建一个进程,该进程以与父应用程序相同的用户身份运行,并在同一会话中运行。你必须使用CreateProcessAsUser/CreateProcessWithLogonW/ CreateProcessWithTokenW 以另一个用户身份创建进程。唯一的例外是ShellExecute,如果使用 UAC 提升并且用户不是管理员,它可以将进程创建为不同的用户。

如果您需要与其他服务交互,您可以使用ChangeServiceConfig 使自己依赖于其他服务。服务控制管理器会在启动你的服务之前先启动其他服务。

【讨论】:

  • 通过CreateProcessCreateProcessAsUser 创建一个Windows 子系统进程。 CreateProcessWithLogonWCreateProcessWithTokenW 使用 RPC 到“辅助登录”服务。通过ShellExecuteEx "runas" 提升使用 RPC 到 "Application Information" 服务。还可以通过 Task Scheduler 服务的 COM API 以其他用户身份定义和运行任务。这些都利用特权服务调用CreateProcessAsUser
  • 这里可以注意到存在的父母和创造者(谁叫CreateProcess)这通常是相同的,但不是强制性的。子进程与父进程在同一登录会话中运行,与创建者在同一终端会话中运行。从服务创建的进程(当它和父进程)将在注销后继续存在
  • child 不仅从父继承 pid,而且从令牌继承 - 如果我们有父 != 创建者,这将严重影响子。但终端会话继承自创建者(如果我们使用CreateProcess)。在另一个终端会话中运行需要已经使用CreateProcessAsUser。如果使用CreateProcessAsUserPROC_THREAD_ATTRIBUTE_PARENT_PROCESS 会很有趣(我们可以同时使用两者)- 子进程继承显式令牌而不是父进程令牌。但如果我们有 creator==parent,这一切都无关紧要
猜你喜欢
  • 2023-03-20
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2011-02-14
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多