每日速读!如何将SID在二进制和字符串格式中转换
发布时间:2023-03-01 15:55:57 来源:漫漫开发路

今天讲SID细节


【资料图】

上一篇中,我们大概了解了DACL的基本概念。今天我们再来看看其中的SID部分。

我们的问题是:如何将SID在二进制和字符串格式中进行转换?

当然,你可以使用Win32 API来使用代码进行转换,具体就是这两个API: ConvertSidToStringSid 和ConvertStringSidtoSid,但有时候你可能在调试一段内存结构,或者你需要手动地对SID的格式进行转换,那么我们就来看看下表:

举个例子,如果你有一个SDI,值为:S-1-5-21-2127521184-1604012920-1887927527-72713。那么,它对应的原始16进制值为:010500000000000515000000A065CF7E784B9B5FE77C8770091C0100。

我们按照下表来分解一下:

很好,但是那些数字代表什么呢?

每台设备会生成一个唯一ID识别码,用来对SID进行标记,格式为:(-…-…-…-)。

最后一个数字是一个”相对ID(RID)”,用来标识设备的用户账号。实际上,在ntseapi.h头文件中定义了很多预定义的RID。

系统会保留一段(0~999)RID,所以,系统中的第一个非内置账号会得到1000作为ID。这里的数字72713表示这个SID是第72714个被创建的SID。(很显然,这台设备是一台域控制器,用来为成百上千的用户分配账号)

可能上面的说法没那么正确,虽然我说这个是创建的第72714个SID,但是,在某些大型服务器上,SID可能是不连续的,也即,你不能认为SID是严格地连续分配。

总结

系统安全这个主题不是我的专长,所以,上面的信息不一定是完全正确的,但是,我想,应该基本是正确的吧。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《How do I convert a SID between binary and string forms?》

标签:

上一篇:

下一篇: