关于_SID_AND_ATTRIBUTES_HASH结构体多SID问题的咨询
SID_AND_ATTRIBUTES_HASH 疑问解答
对应结构体定义如下:
typedef struct _SID_AND_ATTRIBUTES_HASH { DWORD SidCount; PSID_AND_ATTRIBUTES SidAttr; SID_HASH_ENTRY Hash[SID_HASH_SIZE]; } SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
为什么结构体中存在多个SID?
单个Windows用户确实对应唯一的用户主SID,但Windows的访问控制逻辑校验的是用户安全上下文内的所有关联SID,并不只校验用户本身的SID,这些需要校验的SID包括:
- 用户自身的主SID
- 用户所属的所有本地组、域组SID
- 当前登录会话对应的特殊身份SID,比如Everyone、Authenticated Users、交互式登录用户这类内置身份标识
所以SidAttr数组就是用来存储用户安全上下文内所有关联的SID和对应属性,SidCount就是这些SID的总数量,该结构体设计上本来就需要存储多个SID。
数组中哪一个是对应用户的正确主SID?
SID_AND_ATTRIBUTES_HASH的设计目的是快速校验某个SID是否在当前SID集合中,结构体末尾的Hash数组就是用来加速查找、避免全量遍历数组的,本身没有单独的字段标记哪个是用户主SID。
如果需要找到对应用户的主SID,你可以先通过GetTokenInformation函数传入TokenUser信息类,从当前访问令牌中获取到用户主SID的具体值,再遍历SidAttr数组和每个条目里的SID做匹配,匹配成功的就是目标条目。
内容的提问来源于stack exchange,提问作者Piyush Shekdar
相关产品推荐
相关产品推荐

