添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

产品的Windows服务(Service)之前一直是用 Local System Account 在运行的,但这个版本有需求要换成使用普通的 Domain User 来运行,如下图:

但却出现了问题,之前产品代码中会调用windows API - CreateProcessAsUser,来以另一个账号的身份启动另一个进程,另一个账号是通过UI单独提供的。

之前会成功,但现在却失败,无法启动新进程。

错误码(Error Code)是 1314 ,通过查询文档,这个Error Code的意思是: ERROR_PRIVILEGE_NOT_HELD ,缺少权限。

通过查询CreateProcessAsUser微软的 官方文档 可知,执行此API需要两个权限方可成功,如下:

1. SE_INCREASE_QUOTA_NAME

2. SE_ASSIGNPRIMARYTOKEN_NAME

并且通过查询另一个 文档 ,可知问题的根本原因是: Local System Account默认具有这两个权限,而我们替换用的Domain Account却不具有此权限。

因此必须要给Domain Account来增加权限,方法是:在windows的Local Security Settings中找到User Rights Management,给相关用户增加权限。如下图:

其中SE_INCREASE_QUOTA_NAME对应的权限是Adjust memory quotas for a process,SE_ASSIGNPRIMARYTOKEN_NAME对应的权限是Replace a process-level token。

增加权限后,再执行,可成功,问题解决。

参考资料:

1. CreateProcessAsUser function

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx

2. Privilege Constants

https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx

3. LocalSystem Account

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684190(v=vs.85).aspx