以Local System运行的服务调用CreateProcess的默认账户及持久化咨询
刚好对这两块内容比较熟悉,来给你详细解答下:
关于CreateProcess默认使用的账户
当你的服务以Local System身份运行时,调用CreateProcess创建的子进程默认会继承父进程(也就是你的服务)的安全上下文,也就是同样以Local System账户运行。
这点其实在MSDN的CreateProcess文档里是隐含在安全属性相关描述中的:当你传入的lpProcessAttributes参数为NULL时,新进程会沿用调用者(你的服务)的令牌来运行——因为你没有指定其他安全凭据,系统就默认继承父进程的身份。可能你之前没把这部分和“默认账户”直接关联起来~
关于进程持久化是否需要使用CreateService
首先得明确:CreateService是用来注册新的系统服务的API,它的作用是把某个程序纳入服务控制管理器(SCM)的管理体系,不是用来让普通进程保持运行的工具。
针对你“让进程在服务运行期间保持持久化”的需求,分两种场景来看:
- 如果只是需要这个外部exe在你的主服务运行期间一直存活(比如意外崩溃退出后能自动重启),完全不需要用
CreateService。你可以在服务代码里加个简单的监控逻辑:保存CreateProcess返回的进程句柄,定期调用WaitForSingleObject检查进程状态,一旦发现进程已退出,就再次调用CreateProcess重启它就行。 - 如果你希望这个外部exe本身作为独立服务存在(比如能单独被启动/停止,甚至主服务停了它还能继续运行),那可以考虑把这个exe改写成服务程序(需要处理服务的生命周期命令,比如
SERVICE_CONTROL_STOP),然后用CreateService注册它,再由你的主服务通过StartService来启动它。但这种情况需要外部exe本身支持服务模式,不然注册后也无法正常运行。
内容的提问来源于stack exchange,提问作者Red John
相关产品推荐
相关产品推荐

