You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#从ACCESS_ALLOWED_ACE获取pSID时偏移量8的来源疑问

ACCESS_ALLOWED_ACE结构获取pSID时8字节偏移的来源

你的推断完全正确,这个8字节偏移完全来自结构固定头部的长度累加,没有额外的特殊逻辑:

  • 结构最开头是ACE_HEADER字段,属于定长结构,总长度为4字节,存储ACE类型、继承标记、ACE整体大小等元信息
  • 紧随ACE_HEADER之后的是ACCESS_MASK字段,本质是DWORD类型,固定长度4字节,存储该ACE对应的访问权限位

两个字段长度相加刚好为8字节,且结构按DWORD(4字节)规则对齐,两个字段之间没有额外的内存填充空隙,因此两个固定字段之后的位置,就是结构定义中作为SID起始锚点的SidStart位置,直接在ACE的基址指针上加8就能拿到pSID指针。

你看到的实现代码逻辑是正确的:

IntPtr tempSid = IntPtr.Add(deniedAceIntPtr, 8);

需要注意的是,结构定义里的SidStart只是一个占位用的单DWORD成员,并不是实际的SID数据,它的作用就是标记SID的内存起始位置,不能直接读取这个成员的值当SID指针用。
这个8字节偏移在32位、64位环境下通用,你通过该偏移拿到指针后调用ConvertSidToStringSidW能正常获取SID字符串,也验证了偏移的正确性。

内容的提问来源于stack exchange,提问作者YellowFrog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:39:20