簡體   English   中英

如何判斷當前進程是否為服務(C++、Win32)?

[英]How can I tell if the current process is a service or not (C++, Win32)?

如何判斷我的代碼正在運行的應用程序是在服務中還是在應用程序中? 為什么我想知道這一點 - 我正在編寫一些注入目標應用程序的代碼,而該代碼無法預先知道這些信息,所以它必須自己解決。

我不能依賴從服務控制管理器、啟動、停止或命令行參數調用的任何代碼。

我目前正在查看GetConsoleWindow() ,我希望它會為服務(無控制台)返回NULL ,並為任何應用程序(有控制台)返回窗口句柄。 不確定這個假設有多有效。

有更好的解決方案的想法嗎?

從所有正在運行的服務( EnumServicesStatusEx )列表中搜索當前進程ID( GetCurrentProcessId )?

GetConsoleWindow()的假設無效。

在我看來,您更關心流程的上下文。 您是在問程序是在服務上下文中運行還是在用戶會話中運行? 如果是這樣,請使用ProcessIdToSessionId() http://msdn.microsoft.com/zh-cn/library/aa382990%28v=VS.85%29.aspx來獲取您的會話ID,您將知道它。

使用WMI查詢Win32_Service實例,其中“ ProcessId = MyProcessid”。 如果沒有匹配項,則說明您的進程不是服務。

背景在C ++ WMI創建應用程序在這里

對於 Windows Vista 或更高版本,您可以檢查會話 ID。 會話 0 為服務和非交互式程序保留。 用戶會話從 1 開始。

使用OpenProcessToken獲取當前進程令牌。 然后使用CheckTokenMembership查看令牌是否包含WinServiceSid眾所周知的SID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM