标题：安全标识符
安全标识符
一种不同长度的数据结构，用来识别用户、组和计算机帐户。网络上每一个初次创建的帐户都会收到一个唯一的 SID。Windows 中的内部进程将引用帐户的 SID 而不是帐户的用户名或组名。 
这个安全标识符可以这样给你讲，它是一串特殊的字符串，在你这台电脑如果有和它相同的东西，但不会和他一样的，而这个字串是电脑内部用到的，用户接触不到的。一般这种安全标识符是指当你新建一个用户后，电脑就会为这个用户生成一个特殊的安全标识符 (SID)，如果新建一个用户组（当然很少用到这个，多是在用到类局域网的域才用到），也会如此；当你把这个用户或组删了后，再以同样用户名新建一个用户，而你之前建的那个用户名和你这个用户名就不是一回事了，其区别就是系统为他们关联了各自的安全标识符 (SID)！ 
最明显的例子就是，先前一个用户，然后共享一文件夹，为文件夹设置一个高一点的网络访问权限。在另一台局域网中电脑用这个用户访问并根据权限用其最大可操作的操作它，如读、写、删除、新建等。然后把它删了，再以同样名新建它。你再在局域网中那台电脑访问这个文件夹，你就会发现问题了！　
简介
SID也就是安全标识符（Security Identifiers），是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时，将给网络上的每一个帐户发布一个唯一的 SID。Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户，再删除帐户，然后使用相同的用户名创建另一个帐户，则新帐户将不具有授权给前一个帐户的权力或权限，原因是该帐户具有不同的 SID 号。安全标识符也被称为安全 ID 或 SID。
SID的作用用户通过验证后，登陆进程会给用户一个访问令牌，该令牌相当于用户访问系统资源的票证，当用户试图访问系统资源时，将访问令牌提供给 Windows NT，然后 Windows NT 检查用户试图访问对象上的访问控制列表。如果用户被允许访问该对象，Windows NT将会分配给用户适当的访问权限。 　访问令牌是用户在通过验证的时候有登陆进程所提供的，所以改变用户的权限需要注销后重新登陆，重新获取访问令牌。
SID号码的组成如果存在两个同样SID的用户，这两个帐户将被鉴别为同一个帐户，原理上如果帐户无限制增加的时候，会产生同样的SID，在通常的情况下SID是唯一的，他由计算机名、当前时间、当前用户态线程的CPU耗费时间的总和三个参数决定以保证它的唯一性。 　一个完整的SID包括： 　· 用户和组的安全描述 　· 48-bit的ID authority 　· 修订版本 　· 可变的验证值Variable sub-authority values 　例：S-1-5-21-31044058 8- 2 500 36847- 5 803 895 05-500 　我们来先分析这个重要的SID。第一项S表示该字符串是SID；第二项是SID的版本号，对于2000来说，这个就是1；然后是标志符的颁发机构（identifier authority），对于2000内的帐户，颁发机构就是NT，值是5。然后表示一系列的子颁发机构，前面几项是标志域的，最后一个标志着域内的帐户和组。
SID的获得开始－运行－regedit32－HKEY_LOCAL_MACHINESAMSAMDomainsBuiltinAliasesMembers，找到本地的域的代码，展开后，得到的就是本地帐号的所有SID列表。 　其中很多值都是固定的，比如第一个000001F4（16进制），换算成十进制是500，说明是系统建立的内置管理员帐号administrator，000001F5换算成10进制是501，也就是GUEST帐号了，详细的参照后面的列表。 　这一项默认是system可以完全控制，这也就是为什么要获得这个需要一个System的Cmd的Shell的原因了，当然如果权限足够的话你可以把你要添加的帐号添加进去。 　或者使用Support Tools的Reg工具： 　reg query "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList 　还有一种方法可以获得SID和用户名称的对应关系： 　1. Regedit32: 　HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion ProfileList 　2. 这个时候可以在左侧的窗口看到SID的值，可以在右侧的窗口中ProfileImagePath看到不同的SID关联的用户名， 　比如%SystemDrive%Documents and SettingsAdministrator.momo这个对应的就是本地机器的管理员SID 　%SystemDrive%Documents and SettingsAdministrator.domain这个就是对应域的管理员的帐户 　另外微软的ResourceKit里面也提供了工具getsid，sysinternals的工具包里面也有Psgetsid，其实感觉原理都是读取注册表的值罢了，就是省了一些事情。
SID重复问题的产生安装NT/2000系统的时候，产生了一个唯一的SID，但是当你使用类似Ghost的软件克隆机器的时候，就会产生不同的机器使用一个SID的问题。产生了很严重的安全问题。 　同样，如果是重复的SID对于对等网来说也会产生很多安全方面的问题。在对等网中帐号的基础是SID加上一个相关的标识符（RID），如果所有的工作站都拥有一样的SID，每个工作站上产生的第一个帐号都是一样的，这样就对用户本身的文件夹和文件的安全产生了隐患。 　这个时候某个人在自己的NTFS分区建立了共享，并且设置了自己可以访问，但是实际上另外一台机器的SID号码和这个一样的用户此时也是可以访问这个共享的。
SID重复问题的解决下面的几个试验带有高危险性，慎用，我已经付出了惨痛的代价！ 　微软在ResourceKit里面提供了一个工具，叫做SYSPREP,这个可以用在克隆一台工作站以前产生一个新的SID号码。 下图是他的参数 　这个工具在DC上是不能运行这个命令的，否则会提示 　但是这个工具并不是把所有的帐户完全的产生新的SID，而是针对两个主要的帐户Administrator和Guest，其他的帐号仍然使用原有的SID。 　下面做一个试验，先获得目前帐号的SID： S-1-5-21-2000478354 - 688 78 9 844 - 839 522 115 　然后运行Sysprep，出现提示窗口： 　确定以后需要重启，然后安装程序需要重新设置计算机名称、管理员口令等，但是登陆的时候还是需要输入原帐号的口令。 　进入2000以后，再次查询SID，得到： 　S-1-5-21-759461550-1 453 070 86-51 579 9519，发现SID号已经得到了改变，查询注册表，发现注册表已经全部修改了，当然全部修改了。 　另外sysinternals公司也提供了类似的工具NTSID，这个到后来才发现是针对NT4的产品，界面如下： 　他可不会提示什么再DC上不能用，接受了就开始，结果导致我的一台DC崩溃，重启后提示“安全账号管理器初始化失败，提供给识别代号颁发机构的值为无效值，错误状态0XC0000084，请按确定，重启到目录服务还原模式...”，即使切换到目录服务还原模式也再也进不去了！ 　想想自己胆子也够大的啊，好在是一台额外DC，但是自己用的机器，导致重装系统半天，重装软件N天，所以再次提醒大家，做以上试验的时候一定要慎重，最好在一台无关紧要的机器上试验，否则出现问题我不负责哦。另外在Ghost的新版企业版本中的控制台已经加入了修改SID的功能，自己还没有尝试，有兴趣的朋友可以自己试验一下，不过从原理上应该都是一样的。 　文章发表之前，又发现了微软自己提供的一个工具“Riprep”，这个工具主要用做在远程安装的过程中，想要同时安装上应用程序。管理员安装了一个标准的公司桌面操作系统，并配置好应用软件和一些桌面设置之后，可以使用Riprep从这个标准的公司桌面系统制作一个Image文件。这个Image文件既包括了客户化的应用软件，又把每个桌面系统必须独占的安全ID、计算机账号等删除了。管理员可以它放到远程安装服务器上，供客户端远程启动进行安装时选用。但是要注意的是这个工具只能在单硬盘、单分区而且是Professional的机器上面用。