说到安全标识符SID就要先说说安全主体(Security Principals),安全主体是一个能够对它分配权限的对象,例如,用户、组和计算机; 对于每一个Windows 200x域中的安全主体都有一个惟一的安全标识符SID。

那什么是安全标识符SID呢?安全标识符SID是一个值,这个值唯一地标识一个组织内的用户、组、计算机或服务。每一个帐户在被创建时会分配到一个安全标识符,Windows 200x域中通过安全标识符SID来实现访问控制机制。

那么访问控制机制又是如何实现的呢?对于网络的每个对象(例如一个文件),都有一组访问控制信息,该信息称为安全描述符(Security Descriptor),它控制用户和组允许使用的访问类型。安全描述符由以下三部分组成:所有者安全标识符,自由访问控制列表(DACL)和安全访问控制列表(SACL)。自由访问控制列表(DACL)通过用户(组)的SID确定哪些用户(组)被允许/拒绝访问当前对象。而安全访问控制列表(SACL)则控制如何审计用户(组)对当前对象的访问。

从以上的描述中,我们知道每一个Windows 200x域中的安全主体都有一个安全标识符SID,那这个安全标示符是有什么组成的呢?Windows 200x域中的每一个对象的SID都由当前域的SID加上一个相对标识符RID组成,例如以下是一个2003域中的用户对象:

其中S-1-5-21-3805389047-3781885256-3221930211为当前域的SID:

每一个域同样也被一个SID唯一标识,所以一个域被重命名后,它也无法与之前的域建立Trust信任关系。

在图一中我们看到,紧随域SID之后是一串相对标识符RID,每个 Windows 200x域控制器会被分配到一个RID池,每个RID池中分配有一定范围的RID值。当有一个对象被创建时,域控制器从自己当前的RID池中拿出下一个可以使用的RID分配给此对象,加上当前域的SID,便组成了此对象的唯一标示符SID。每一个AD域中都有一个负责RID的灵活单主机操作(FSMO)叫做RID主控(RID Master),它负责在其域中为每个域控制器颁发独立的RID池,并防止安全主体的SID重复。以下这篇KB中详细介绍了AD中与RID相关的所有属性:

http://support.microsoft.com/kb/305475/en-us

说了这么多SID,那么究竟我们应该怎么来查看一个对象的SID呢?微软提供了一个官方工具PSgetsid.exe,我们可以通过以下链接获取:

http://technet.microsoft.com/en-us/sysinternals/bb896649

通过PSgetsid.exe我们可以查看相应用户的SID:

同样,通过SID,我们可以查看对应的用户:

在以上例子中我们看到的SID都是以字符串形式展现在我们面前的,如S-1-5-21-3805389047-3781885256-3221930211-1601。但是SID是如何存储于AD域中的呢?其实真正的SID都是以十六进制数字形式存储的:

在某些应用程序的日志中我们有时会发现,所有的SID的显示形式都是一串数字,那么我们怎么才能将存储的十六进制数字转换为可以阅读的字符串形式呢?以下我们来看看这两种表达方式之间的对应关系:

首先,我们看下每个字段分别代表什么意思:

字符串

S

1

5

21-3805389047-3781885256-3221930211

1601

作用

该字符串是安全标识符

版本标识

标识符颁发机构

域或者本地计算机标识符

相对标识符

可能的标识符颁发机构有:

0 – Null
Authority

1 – World Authority

2 – Local Authority

3 – Creator Authority

4 – Non-unique Authority

5 – NT Authority

9 – Resource Manager Authority

接着,我们来看SID的数据结构是如何定义的:

////////////////////////////////////////////////////////////////////////

//                                                                  
//

//              Security Id     (SID)                                 //

//                                                                    //

////////////////////////////////////////////////////////////////////////

//

//

// Pictorially the structureof an SID is as follows:

//

//         1  1   1   1  1   1

//         5  4   3   2  1   0   9  8   7   6  5   4   3  2   1   0

//    
+—————————————————————+

//      |    
SubAuthorityCount       |Reserved1 (SBZ)|   Revision    |

//    
+—————————————————————+

//      |                   IdentifierAuthority[0]                      |

//    
+—————————————————————+

//      |                   IdentifierAuthority[1]                      |

//      +—————————————————————+

//      |                   IdentifierAuthority[2]                      |

//    
+—————————————————————+

//      |                                                              |

//      +- – –  –  – –  –  – SubAuthority[]  –  – –  –  – –  –  – -+//      |                                                             
|

//    
+—————————————————————+

//

typedef struct _SID_IDENTIFIER_AUTHORITY{

BYTE Value[6];

} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY;

typedef struct _SID {

BYTE Revision;

BYTE SubAuthorityCount;

SID_IDENTIFIER_AUTHORITYIdentifierAuthority;

[size_is(SubAuthorityCount)] DWORD SubAuthority[*];

} SID, *PISID;

#define SID_REVISION                     (1)    // Current revision level

#define SECURITY_NT_AUTHORITY          {0,0,0,0,0,5}   // ntifs

以上信息具体可以参考如下链接:

http://msdn.microsoft.com/en-us/library/aa379597(v=VS.85).aspx

最后我们来分析下如何将存储的十六进制数与字符串进行转换:

01 —-> S-1

05 —-> 5

此处表示以下有5个小端字节序数。

00 00 00 00 00 05 —-> 5

此处表示标识符颁发机构为NT Authority。

以下为小端字节序:

15 00 00 00 —-> 0x00000015 —-> 21

F7 A0 D1 E2 —-> 0xE2D1A0F7 —->
3805389047

48 FD 6A E1 —-> 0xE16AFD48 —-> 3781885256

E3 C0 0A C0 —-> 0xC00AC0E3 —-> 3221930211

41 06 00 00 —-> 0x00000641 —-> 1601

将以上字符串连接起来为S-1-5-21-3805389047-3781885256-3221930211-1601。

通过这个方式,我们可以很轻松地在两种模式的SID间进行转换,加上PSgetsid.exe工具的帮助,快速找到所需的对象,从而更加有效地分析应用程序的日志。

每个域中都有一些常见的特殊用户,如Administrators组,Guest等,他们的安全标识符都是固定的,以下链接中列出了所有特殊用户的SID:

http://support.microsoft.com/kb/243330/en-us,在一些日常工作中,如果我们看到此类长度比较短的SID,我们便可以通过这个链接进行查询。

安全标识符SID技术介绍及查看技巧的更多相关文章

  1. .Net环境下的缓存技术介绍 (转)

    .Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 ...

  2. RAID技术介绍

    RAID技术介绍 简介 RAID是一个我们经常能见到的名词.但却因为很少能在实际环境中体验,所以很难对其原理 能有很清楚的认识和掌握.本文将对RAID技术进行介绍和总结,以期能尽量阐明其概念. RAI ...

  3. .Net环境下的缓存技术介绍

    .Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1 ...

  4. 网络存储技术介绍(1) ( based on zt)

    最近由于某同学微信发了一些网络存储的文章,开始感兴趣,稍微收集了一些 一.  网络存储技术 http://ask.zol.com.cn/q/187044.html  (yxr:很老的技术介绍吧) 网络 ...

  5. (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...

  6. VPS技术介绍以及分析

    VPS的全称为Virtual Private Server,叫做虚拟专用服务器(Godaddy称之为Virtual Dedicated Server,VDS).就是利用各种虚拟化手段把单台物理服务器虚 ...

  7. 转:Android 2.3 代码混淆proguard技术介绍

    ProGuard简介 ProGuard是一个SourceForge上非常知名的开源项目.官网网址是:http://proguard.sourceforge.net/. Java的字节码一般是非常容易反 ...

  8. WPF开发技术介绍

    本月做了一个小讲座,主要是WPF的开发技术介绍,由于是上班时间,去听的人不多,但对于自己来说至少是又巩固了Winform的知识,抽时间写一篇文章,在此分享给大家,有什么宝贵建议大家也可以提给我,谢谢. ...

  9. Portal技术介绍

      Portal技术介绍 Portal是web应用发展的一个重要趋势,目前几乎所有大的软件厂商都有自己的Portal产品.并且Portal技术已经形成规范.本文对Portal技术和产品进行了分析,目的 ...

随机推荐

  1. javascript_this的用法

    javascript : this的用法 1.this代表全局对象 2.作为函数对象的公共方法(new对象后,可以调用带this关键字的属性) 总结:如果在javascript语言里没有通过new(包 ...

  2. 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

    来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...

  3. Jmeter模拟不同带宽

    Jmeter自带模拟带宽设置,当然前提肯定是你当前的带宽>=你要模拟的带宽,好比你装了个4m的宽带,要模拟100m的带宽,那是做梦 做起来也不难,打开user.properties文件,增加如下 ...

  4. H5新出的flex布局

    百度前端技术学院第一阶段中的任务十,就是关于flexbox布局的 与flexbox布局相关的资料如下: 1.flex布局教程-语法篇-阮一峰的网络日志  http://www.ruanyifeng.c ...

  5. CentOS7.2部署OpenStack(一)—环境准备

    1.系统环境 # uname -r 3.10.0-327.el7.x86_64 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Cor ...

  6. LR12.53—第6课:运行负载测试

    第6课:运行负载测试 当你运行一个负载测试,LoadRunner将生成系统上的负载.然后,您可以使用LoadRunner的监控器和图形负载下,观察系统的性能. 在这一课中,你将涵盖以下主题: 一目了然 ...

  7. LR12.53—使用HP网络导游示例应用程序

    本教程使用 的HP Web之旅,一个样本的基于Web的旅行社系统,向人们展示LoadRunner将如何作为负载测试解决方案.惠普网络旅游用户连接到Web服务器,搜索航班,预订机票,检查飞行路线. 虽然 ...

  8. mouseover和mouseout、mouseenter和mouseleave

    又一个傻傻分不清楚的东东~ 现实真是一个问题天天有的世界~本以为我对js中的事件还是比较了解的,对于早就接触的mouse事件,更是觉得得心应手了~但是现实却给了我一记重拳! 我自身工作中遇到的犯二的故 ...

  9. 基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...

  10. Python字符串的encode与decode研究心得乱码问题解决方法

    为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式? 为什么会报错“UnicodeEncodeError: 'asc ...