说到安全标识符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. 如何在winform或者wpf里面打开浏览器并设置宽高位置

    需要SHDocVw.dll 文件或AxSHDocVw.dll 文件,.net默认是没有的,先生产这两个文件,请在Visual Studio 命令提示符下运行下面的命令: aximp %WINDIR%\ ...

  2. EA中的模板管理

    EA在导出文档的时候可以选择各种模板. 使用系统提供的模板导出的文档会稍显繁杂.这时候就需要我们自定义模板. 1. 在导出文档的dialog, 在Template一项中选择 New Template. ...

  3. JS获取文本值

    var closeBtn=document.getElementById("close_btn"): closeBtn.innerHTML即是文本值,如果要的是数字parseInt ...

  4. jsp+tomcat+mysql+sevlet+javabean配置过程

    在配置jsp开发环境的过程中会碰到不少问题,感谢网上的许多前辈的经验总结,作者cl41的JSP连接Mysql数据库攻略和作者Saulzy的MySQL学习笔记等文章对我来说简直是雪中送碳,为了帮助象我一 ...

  5. js正则表达式replace里有变量的解决方法用到RegExp类

    一直比较害怕使用正则表达式,貌似很深奥很复杂的样子,所以在用js操作字符串的时候,我最多使用的是replace.split.substring.indexOf等函数,这些函数有时候需要多次叠加使用,但 ...

  6. centos 7 相关的一些记录

    开80端口: /tcp --permanent 重新加载防火墙: sudo firewall-cmd --reload 安装nginx: sudo rpm -Uvh http://nginx.org/ ...

  7. LR常用函数以及调用自定义函数

    2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...

  8. 利用BeautifulSoup抓取新浪网页新闻的内容

    第一次写的小爬虫,python确实功能很强大,二十来行的代码抓取内容并存储为一个txt文本 直接上代码 #coding = 'utf-8' import requests from bs4 impor ...

  9. 如何在Android Studio中添加RecyclerView-v7支持包

    1.打开SDK Manager,在Extras树下找到Android Support Library,下载好支持包.RecyclerView在v7-21版本就出来了.我这里不用更新了,说明是最新的,怎 ...

  10. 传输层(3)-缓冲区大小及限制、TCP输出

    3.缓冲区大小及限制 影响IP数据报大小的限制. 1)IPv4数据报,最大大小是65535. 2)硬件规定的MTU.以太网的MTU是1500字节.SLIP链路1006字节或296字节 3)路径MTU. ...