正确的方法来确定服务是否作为SYSTEM用户运行

时间:2010-10-26 12:22:05

标签: c windows permissions system

找出进程是否以SYSTEM用户身份运行的正确方法是什么。我正在寻找一个win32 C API来检查系统用户。

我们曾经检查用户名是否为“SYSTEM”,但是自Windows Server 2008 R2起,SYSTEM用户似乎已本地化。即荷兰系统上的SYSTEEM。

我无法通过搜索引擎找到有关系统用户的大量信息,因为您会收到数百万次虚假命中。

提前致谢 尼尔

1 个答案:

答案 0 :(得分:8)

有一些代码可以独立于本地化here执行此操作。

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;
}

对于定义here的任何众所周知的SID,相同的代码都可以工作(如果已修改)。