如何确定进程的完整性级别?

5

最近我需要获取进程的完整性级别,我在MSDN上找到了帮助。示例代码如下:

if (GetTokenInformation(hToken, TokenIntegrityLevel, 
     pTIL, dwLengthNeeded, &dwLengthNeeded))
 {
  dwIntegrityLevel = *GetSidSubAuthority(pTIL->Label.Sid, 
    (DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTIL->Label.Sid)-1));

  if (dwIntegrityLevel == SECURITY_MANDATORY_LOW_RID)
  {
   // Low Integrity
   wprintf(L"Low Process");
  }
  else if (dwIntegrityLevel >= SECURITY_MANDATORY_MEDIUM_RID && 
       dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID)
  {
   // Medium Integrity
   wprintf(L"Medium Process");
  }
  else if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID)
  {
   // High Integrity
   wprintf(L"High Integrity Process");
  }
  else if (dwIntegrityLevel >= SECURITY_MANDATORY_SYSTEM_RID)
  {
   // System Integrity
   wprintf(L"System Integrity Process");
  }
 }

众所周知,

SECURITY_MANDATORY_LOW_RID == 0x00001000L
SECURITY_MANDATORY_MEDIUM_RID == 0x00002000L
SECURITY_MANDATORY_HIGH_RID == 0x00003000L
SECURITY_MANDATORY_SYSTEM_RID == 0x00004000L.
以下是我的问题:
如果这个示例代码正确,那么如果进程A具有dwIntegrityLevel0x00004100L,它的完整性级别是什么? SECURITY_MANDATORY_HIGH_RIDSECURITY_MANDATORY_SYSTEM_RID?这是不是意味着一个具有SECURITY_MANDATORY_SYSTEM_RID级别的进程也具有SECURITY_MANDATORY_HIGH_RID级别?
如果示例代码错误,那么确定进程的完整性级别的正确方法是什么?
2个回答

4
请注意,在WinNT.h中有一个等效的声明:
#define SECURITY_MANDATORY_MEDIUM_PLUS_RID  (SECURITY_MANDATORY_MEDIUM_RID + 0x100)

这听起来像是你遇到了一个名为"SYSTEM_PLUS"的进程。

我真正想知道的是,示例代码是否是确定进程完整性级别的正确方法? - ericchan1336
2
不,你错过了一些&& dwIntegrityLevel < ... 从高到低排序。 - Hans Passant
顺便问一下,为什么微软在示例代码中没有注意到 some && dwIntegrityLevel < - BattleTested_закалённый в бою

0

1
Raymond Chen有一篇关于这个概念的很好的博客文章:https://devblogs.microsoft.com/oldnewthing/20221017-00/?p=107291 - John Dyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接