CreateProcess在系统服务的本地系统账户下返回C0000142

鑫森淼焱垚 2018-09-10 11:51:07
一个windows服务程序,登录身份是本地系统账户,程序中需要用CreateProcess创建一个子进程,当服务属性选择不允许服务与桌面交互时,CreateProcess返回成功,但GetExitCodeProcess获取到子进程的返回码是C0000142。实际子进程并没有创建成功。郁闷的是这种情况并不是每次执行都会出现,有时失败后重复1次就可以正常执行,有时重试很多次也无法成功,有时跑一天都很正常,没有找到规律。
服务类型选了允许服务与桌面交互时还没有发现这种情况,但是win7上执行会有弹出交互式服务检测的提示,不太友好。
网上搜到了stackoverflow上的问题贴,没发现合适的解决方法,因为这个服务启动的子进程不是自己开发的,没法修改子进程的源码。
windows官网上有session,station和desktop的解释也没太搞明白,大约是要用一个登录的用户去执行子进程。有没有遇到过类似情况的朋友给一个解决方案:选择不允许与桌面交互时可以成功创建子进程,选择允许与桌面交互时不弹出交互式服务检测提示,不要用停止Interactive Services Detection服务的方法,太暴力了。
...全文
123 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-09-11
  • 打赏
  • 举报
回复
CreateProcessAsUser
red-fly 2018-09-10
  • 打赏
  • 举报
回复
关于windows服务,我用得确实不多。之前只用过简单的功能,读取自定义格式的磁盘,该服务启动后尝试加载所有磁盘,并逐个查看是否有自定义的标记,如果有,就读取这个磁盘(把这个磁盘加入可读取列表),否则就跳过,不加入列表。该服务不创建其它进程,在有需要该服务时,就通过预先定义的管道来通讯。这个服务需要以administrator用户安装并设置为随系统启动而启动。安装并设置完后,就可以用普通用户登录系统并使用该服务了。
至于楼主说的创建子进程,createProcess(),我也用的不多,仅用过简单的创建一个进程,然后就不管它了,当然是在普通程序里而不是在服务里。
根据网上搜索C0000142,再加上我的理解,估计还是权限问题。子进程需要访问某些资源,但有时候这个资源被锁定或者其它情况导致无法被子进程访问,此时出现问题。
不知道楼主的子进程是做什么用的,是否需要和其它本地程序交互

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧