使用LsaManageSidNameMapping为SID添加名称
在研究服务SID如何映射回名称时,我发现了API LsaLookupManageSidNameMapping
。毫不意外,这个API在MSDN或Windows SDK中都没有正式文档。不过,LsaManageSidNameMapping
倒是有文档(大部分)。经过一番挖掘,发现它们最终都指向LSASS中的同一个RPC函数,只是名称不同:
LsaLookupManageSidNameMapping
→ lsass!LsaLookuprManageCacheLsaManageSidNameMapping
→ lsasrv!LsarManageSidNameMapping
它们最终都会调用 lsasrv!LsarManageSidNameMapping
。我不清楚为什么会有两个版本,以及为什么一个有文档而另一个没有。耸肩。当然,尽管MSDN上有这个函数的条目,但似乎在Ntsecapi.h头文件中并没有实际文档。再次耸肩。我找到的最好的文档是这个头文件。
这让我思考是否可以通过LSASS映射所有AppContainer命名功能,让普通应用程序解析它们,而不是我自己处理。这比修改SAM或类似的技巧要容易。遗憾的是,虽然可以通过这个API添加一些SID到名称的映射,但对于功能SID却不行,因为有如下调用限制:
- 调用者需要SeTcbPrivilege(这是LSA API的基本要求)。
- 要映射的SID必须在NT安全机构(5)中,且域的第一个RID必须在80到111之间(含)。
- 必须首先注册包含该SID的域SID名称。
基本上,第二条限制阻止了我们为功能添加子域SID,因为它们使用包安全机构(15),而且我们不能直接添加SID到名称映射,因为需要先用API注册域,仅域存在是不够的。也许有其他简单的方法,但这不是。
相反,我整理了一个.NET工具来添加或删除你自己的SID到名称映射。它已经在github上。映射是临时的,所以如果你搞砸了什么,重启应该能修复。:-)