转载地址:http://blogs.msdn.com/b/gaihu/
在Windows安全解析(1):基本概念中,我们简要介绍了SID。本文章将要深入介绍SID的相关信息,包含如何在实际工作中使用SID。
在Win API中,SID在ntifs.h的定义如下:
typedef struct _SID {
UCHAR Revision;
UCHAR SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
ULONG SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
伴随着这个定义,Windows API提供了一系列的函数可以获取和管理SID。
函数 | 描述 |
---|---|
AllocateAndInitializeSid | 申请一个SID并且初始化SID的数据 |
ConvertSidToStringSid | 把一个SID从上述的结构化表示转化为字符串表示的形式 |
ConvertStringSidToSid | 把一个字符串形式表示的SID转化为上述的结构的SID的表示 |
CopySid | 拷贝SID |
EqualPrefixSid | 判断两个SID的头部分是否等同 |
EqualSid | 判断两个SID是否等同 |
FreeSid | 释放通过前述的AllocateAndInitializeSid函数申请的SID占用的空间 |
GetLengthSid | 获取一个SID的长度 |
GetSidIdentifierAuthority | 获取一个SID对应的Authority的SID。这个Authority是指前述文章中的根签发者。 |
GetSidLengthRequired | 根据一定的Sub Authority(中间签发者)的数目计算存储这个SID所需要的空间 |
GetSidSubAuthority | 获取一个SID的某个中间签发者(Sub Authority)的SID的指针 |
GetSidSubAuthorityCount | 或者SID中的中间签发者(Sub Authority)的数目 |
InitializeSid | 初始化一个SID |
IsValidSid | 测试一个SID是否是有效的。有效地SID的Revision的值在可允许范围之内,且中间签发者(Sub Authority)的数目少于可允许的最大数目。 |
LookupAccountName | 根据账户名字获取对应的SID |
LookupAccountSid | 根据SID获取账户名字 |
同时,从 .Net Framework 2.0开始,CLR在System.Security.Principal命名空间中提供了SecurityIdentifier来提供对SID进行查询管理操作,其提供的功能与上述API类似,但是更加易于使用。
另外,从Windows 2000开始,操作系统提供了一个命令用来查询SID。第一个命令是whoami,用whoami /user可以获取到当前登录用户的用户名和SID。如下:
用whoami /all命令可以查询到当前用的SID对应的所有中间签发者和签发者的SID信息。
你还可以用whoami /?查询whoami命令提供的其他功能。
Windows SysInternals 提供了PsGetSID.exe工具来帮助我们获取任意一个安全身份的SID,前提是你需要有相应的权限,或者查找对应于一个SID的安全身份的名字。
前述文章中提到过SID的结构中标明当前安全身份的RID,对于一般的安全身份,RID从1000之后开始取值,Windows保留1000之下的RID作为系统组或者账户的标志。这些系统或者组的RID信息可以参见文章http://support.microsoft.com/kb/243330。