如何检测我的应用程序是作为服务运行还是在交互式会话中运行?

bog*_*dan 16 c++ windows-services

我正在编写一个能够作为服务或独立运行的应用程序,但我想检测应用程序是作为服务执行还是作为普通用户会话执行.

小智 10

如果这是一个C++应用程序,在启动代码中的某个地方,您必须调用StartServiceCtrlDispatcher.如果失败并GetLastError()返回ERROR_FAILED_SERVICE_CONTROLLER_CONNECT,则该应用程序尚未作为服务启动.

  • 具体来说,`GetLastError()`将返回`ERROR_FAILED_SERVICE_CONTROLLER_CONNECT`. (3认同)

Chr*_*lor 7

另一种选择是使用System.Environment.UserInteractive http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx

更新:为了弥补发布C++主题的.NET答案,我提供了基于.NET实现的C实现.

BOOL IsUserInteractive()
{
   BOOL bIsUserInteractive = TRUE;

   HWINSTA hWinStation = GetProcessWindowStation();
   if (hWinStation != NULL)
   {     
     USEROBJECTFLAGS uof = {0};     
     if (GetUserObjectInformation(hWinStation, UOI_FLAGS, &uof, sizeof(USEROBJECTFLAGS), NULL) && ((uof.dwFlags & WSF_VISIBLE) == 0))
     {
       bIsUserInteractive = FALSE;
     }     
   }
   return bIsUserInteractive;
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*uke 6

我认为您可以在Interactive组中查询进程令牌以获取成员资格.

来自http://support.microsoft.com/kb/243330:

SID:S-1-5-4

名称:互动

描述:包含以交互方式登录的所有用户的组.成员资格由操作系统控制.

使用TokenGroups调用GetTokenInformation以获取与运行该进程的帐户关联的组,然后迭代查找Interactive sid的sid.

我在http://marc.info/?l=openssl-dev&m=104401851331452&w=2找到了一大堆代码