Правильный способ выяснить, работает ли служба как пользователь SYSTEM - PullRequest
3 голосов
/ 26 октября 2010

Как правильно узнать, запущен ли процесс как пользователь SYSTEM. Я ищу win32 C API для проверки пользователя системы.

Раньше мы проверяли, было ли имя пользователя «SYSTEM», но, начиная с Windows Server 2008 R2, пользователь SYSTEM выглядит локализованным. I.e СИСТЕМА в голландской системе.

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

Спасибо заранее Neil

1 Ответ

8 голосов
/ 26 октября 2010

Существует код, который делает это независимо от локализации здесь .

BOOL IsLocalSystem()
{
  HANDLE hToken;
  UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];
  PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;
  ULONG cbTokenUser;
  SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;
  PSID pSystemSid;
  BOOL bSystem;

  // open process token
  if (!OpenProcessToken(GetCurrentProcess(),
    TOKEN_QUERY,
    &hToken))
      return FALSE;

  // retrieve user SID
  if (!GetTokenInformation(hToken, TokenUser, pTokenUser,
    sizeof(bTokenUser), &cbTokenUser))
  {
    CloseHandle(hToken);
    return FALSE;
  }

  CloseHandle(hToken);

  // allocate LocalSystem well-known SID
  if (!AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID,
    0, 0, 0, 0, 0, 0, 0, &pSystemSid))
    return FALSE;

  // compare the user SID from the token with the LocalSystem SID
  bSystem = EqualSid(pTokenUser->User.Sid, pSystemSid);

  FreeSid(pSystemSid);

  return bSystem;
}

Тот же код будет работать (если он будет изменен) для любого из известных SID, определенных здесь .

...