Как я обнаруживаю, что мое приложение работает как сервис или на интерактивной сессии?

Я пишу приложение, которое может работать как услуга или автономный, но я хочу обнаружить, если приложение выполнялось как услуга или на сессии обычного пользователя.

16
задан bogdan 19 April 2010 в 15:51
поделиться

4 ответа

Я думаю, вы можете запросить токен процесса для членства в интерактивной группе.

Из http://support.microsoft.com/kb/243330 :

SID: S-1-5-4

Название: Интерактивный

Описание: Группа, которая включает всех пользователей, которые вошли в систему в интерактивном режиме. Членство контролируется операционной системой.

Вызовите GetTokenInformation с TokenGroups, чтобы получить группы, связанные с учетной записью, под которой выполняется процесс, затем переберите идентификаторы sid в поисках интерактивного sid.

Я нашел хороший фрагмент кода на http://marc.info/?l=openssl-dev&m=104401851331452&w=2

6
ответ дан 30 November 2019 в 21:10
поделиться

Я думаю, вы можете основывать свое обнаружение на том факте, что службы работают с SessionID 0, а учетные записи пользователей имеют другие значения (например, 1).

 bServiceMode = false;
 SessionID=-1;
 Size=0;
 hToken = NULL;
 (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
     GetLastError();

 if (!GetTokenInformation(hToken, TokenSessionId, &SessionID, sizeof(SessionID), &Size) || !Size)
     return FALSE;
 if(SessionID==0)
    bServiceMode = true;
3
ответ дан 30 November 2019 в 21:10
поделиться

Другой вариант - использовать System.Environment.UserInteractive http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx

Обновление : чтобы компенсировать публикацию ответа .NET на тему C ++, я предоставляю реализацию C, основанную на реализации .NET.

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;
}
7
ответ дан 30 November 2019 в 21:10
поделиться

Процесс в обычном сеансе пользователя всегда имеет оконную станцию ​​с именем WinSta0 .

wchar_t buffer[256] = {0};
DWORD length = 0;
GetUserObjectInformation(GetProcessWindowStation(), UOI_NAME, buffer, 256, &length);
if (!lstricmp(buffer, "WinSta0")) {
  // normal user session
} else {
  // service session
}
-1
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: