开发者不愿意触碰的一个东西:安全描述符
有一些Win32 API会带有一个可选的安全描述符(LPSECURITY_ATTRIBUTES)参数,大多数开发者为了简便传入了一个NULL值,这表明:API将获取一个默认的安全描述符。那么,这个默认的安全描述符,到底是一个什么东西呢?今天来说道说道。
当然,当我们碰到麻烦,第一个应该去的地方就应该是MSDN。
里面是这么解释的:默认的DACL来自可继承的ACE(如果对象在一个层次结构中,例如文件系统或者注册表),否则,默认的DACL来自对象创建者的主Token或者模拟的Token。
那么,什么是主Token呢?
实际上,我也不知道。让我们写个小程序来研究研究吧。
好吧,我承认,我写这篇文章的主要目的就是为了调用这个API: ConvertSecurityDescriptorToStringSecurityDescriptor。
它可能是Win32 API中名字最长的一个函数了。如果你的眼力好的话,可能也看出来了,我在代码里使用了NT变量的命名风格,而不是常用的匈牙利风格。(我也只是玩玩而已啦)
如果你执行上面的代码,则你应该会得到如下面所展示的一行东西:
(这是个什么玩意?) 是的,我一开始也会这样问自己。
让我们来翻译翻译:
> “D: ” – 这里表明是一段DACL的开始。
> “(A;;GA;;;S-…)” – 允许(Allow)我对”S-“的所有访问(Generic All)。默认情况下,每个用户对他们自己创建的进程拥有所有访问权限。
> “(A;;GA;;;SY)” – 允许对”Local System”的所有访问(Generic All)。
在接下来的文章中,我可能还会再翻译翻译DACL中那段最长的部分”S-“,请拭目以待。
总结
一般,我也是为了方便(其实是不想花时间研究),传入一个默认的安全描述符。
在大多数情况下,这都能正常工作。
但是,万一,有一天,你的应用场景中需要传入一个自定义的安全描述符,则可能就需要花些功夫研究研究本文里说的这个玩意儿了。
也即:出来混,迟早都是要还的。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What is the default security descriptor?》