2010-07-19 162 views
3

請儘快幫助我。 我正在編寫C++代碼來運行服務,它在管理員帳戶 上正常工作,但在非管理員用戶帳戶上,OpenSCManager()函數返回null。 請告訴我如何授予非管理員用戶帳戶權限來啓動和停止服務。 或者我需要做別的事情。 請儘快回覆在非管理帳戶OpenSCManager()函數返回空

+0

獲取NULL後,GetLastError()API調用會返回什麼?如果使用Visual C++,你可以在OpenSCManager()調用中放置一個斷點,在Watch窗口中執行'Step'並放入'@err' - 值是什麼? – JBRWilkinson 2010-07-19 10:03:23

回答

11

也許您打電話OpenSCManager指定SC_MANAGER_ALL_ACCESS標誌,實際上它需要一組默認授予管理員權限。要在此啓動/停止服務,您只需指定SC_MANAGER_CONNECT標誌,默認情況下該標誌將顯示給任何經過身份驗證的用戶。

既然您有一個服務管理器的句柄,您必須使用OpenService來獲得該服務的句柄。要有權啓動/停止服務,您應該指定GENERIC_READ | GENERIC_EXECUTE作爲所需的訪問權限(實際上,我認爲您甚至可以將所需權限縮小到僅限於SERVICE_STARTSERVICE_STOP,如有必要,還可以)。

這裏是這樣的問題:標準服務DACL不會給普通用戶授予這樣的權限,所以你應該改變你需要啓動的服務的DACL以允許普通用戶啓動/停止它;見here。有關服務訪問權限的更多信息,請參閱here

如果不是單一的服務,而是想讓普通用戶啓動/停止任何服務,我不知道是否有可能不更改所有的DACL,但在我看來,這絕對是一個壞主意。

請注意,即使在單服務情況下,如果服務在特權帳戶下運行(例如LocalSystem),或者它是重要的系統服務,讓非特權用戶混淆它,這仍然是一個壞主意。您應該允許用戶僅啓動/停止對系統不重要的服務。

出於好奇,爲什麼你需要讓用戶啓​​動/停止服務?

+0

+1這樣一個全面的答案! – JBRWilkinson 2010-07-19 10:01:14

+0

謝謝! :)(隨機文本到15個字符) – 2010-07-19 10:27:14

+0

爲了將來的參考,您可以更改服務管理器本身的權限(儘管它可能不是一個好主意!)例如,請參閱http://support.microsoft.com/KB/907460 – 2012-10-23 18:31:16