Windows安全解析(2):SID

时间:2022-10-31 18:24:40

转载地址: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。如下:

Windows安全解析(2):SID

用whoami /all命令可以查询到当前用的SID对应的所有中间签发者和签发者的SID信息。

你还可以用whoami /?查询whoami命令提供的其他功能。

 

Windows SysInternals 提供了PsGetSID.exe工具来帮助我们获取任意一个安全身份的SID,前提是你需要有相应的权限,或者查找对应于一个SID的安全身份的名字。

Windows安全解析(2):SID

前述文章中提到过SID的结构中标明当前安全身份的RID,对于一般的安全身份,RID从1000之后开始取值,Windows保留1000之下的RID作为系统组或者账户的标志。这些系统或者组的RID信息可以参见文章http://support.microsoft.com/kb/243330。