事情起因是這樣,
產品的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
Thanks.
- Kevin Song
2016年1月5日