注册表 SAM

这个是在一次服务器的维护中找到的资料,比较有用,也不知道放哪里,就放"下班时光"吧

这篇文章主要是说明一下Windows系统下的用户和组在注册表中的存放位置与存放内容.实际的用处不是很多,主要是让我们大家可以更多的了解Windows注册表.

好了,多于的话就说到这里,下面就让我带着大家走进Windows注册表的SAM里吧......

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

首先,我先和大家说一下我使用的操作系统为Microsoft Windows Server 2003 Enterprise Edition (Service Pack 1).对于这个操作系统相信大家都不会感到陌生,该系统是以Windows NT为基本内核的操作系统,有着与Windows 2000和Windows XP一样的内核部分,我就是在这个系统下完成这个研究和这篇文章的.

大部分人都知道以Windows NT为内核的操作系统,它的注册表保存位置在system32\config目录内,其中与用户和组有关的内容是保存在SAM文件当中.当Windows系统启动后,为了后面对用户和组进行比较方便的访问,就把SAM文件内关于用户和组的部分(不是全部的)内容映射在注册表内两个地方:"HKEY_LOCAL_MACHINE\SAM\SAM"和"HKEY_LOCAL_MACHINE\SECURITY\SAM".这两处的内容是完全一样的.

由于以上两处的内容是完全一样,所以我在这里仅以"HKEY_LOCAL_MACHINE\SAM\SAM"做说明.

好了,现在让我们在"远行"窗口中输入"regedit"来打开"注册表编辑器".这个我要说明一点,我在上面所说明的两个注册表位置因为权限的问题在一般情况下是看不到的.所以我们要修改它们的权限,在"注册表编辑器"中选择以上两处注册表位置,在"编辑"菜单中选择"权限",这样就可以打开对应位置的权限对话框.在对话框中我们可以看到只有两个选项("SYSTEM"和"Administrators").我们选择"Administrators",并在下面的"完全控制"中为"允许"打上勾,接着点"确定",最后在按"F5"刷新一下就可以看到里面的所有内容了.

在"HKEY_LOCAL_MACHINE\SAM\SAM"下的"RXACT"项目只有一个默认值,内容不详.

在"HKEY_LOCAL_MACHINE\SAM\SAM\Domains"下有二个项目:"Account"、"Builtin".前者包含系统下所有的用户和由用户创建的组.而后者包含系统所有本身的组.

我们就从大到小,由组开始说起.

在"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin"下有三个项目:"Aliases"、"Groups"、"Users"

其中Groups和Users没有什么实质性的内容,可以不用去管它.

在Aliases下我们可以看到很多的注册表项目,我主要它们分为三类:
1)Members这个项目的真正意义我也不是很清楚,只能大概的设想一下.
在这个项目下有两个子项:S-1-5和S-1-5-21-**********-**********-*********
1.S-1-5子项我也看不太懂,因为它的内容太少了,也没有什么联系.
2.S-1-5-21-**********-**********-*********其中"*"部分为对应的数字,对于这个数字来说,每一台计算机都是不一样的,除GOSHT安装版、网络同传外.这一长串的数字因该是指这台计算机的维一的GUID(全球维一标识符)号码.
在这个项目之下的子项是在这台计算机中所有有本地登录权限的用户账户(只是个映射).至于这个项目下有些什么用户,我个人先在这里卖个关子,就先不做任何说明,大家只要看完这篇文章,自己比对一下就一目了然了.

 


以下注释部分内容是我在写完这篇文章后继续研究发现的内容,所以直接添加到该处,并加入说明(希望大家先看完这篇文章再看这里,这样比较容易理解一点).
/********注释********/

在上面我已说过,这里的内容是在这台计算机中所有有本地登录权限的用户账户,现在我来说明一下每个用户的默认值的意思.
首先是它的数据,每个用户的默认值的数据都是一个特殊符号,这些符号的意思是什么???特别说明一下这些特殊符号都是Unicode格式,在ASCII格式的文本文件中是不能显示出来的,或显示出来的是乱码.如果大家把这编文章COPY下,并放在计事本中保存,那么记得在保存时,选择编码为"Unicode"就可以了(选项在"另存为"对话框的最下面).

经我发现这些符号指的是某个用户的主要权限.那什么又是主要权限呢???
比方说,一个用户在多个组中,如:Administrator,Users.那这个用户的权限是什么呢,大家一定会说这个用户在管理员.没有错,所以这个特殊符号指的就是这个.我们可以做个试验,添加一个用户,把它放在任何多个组中,其中要有Administrator,那么这个用户在这里的默认值数据就为"Ƞ",和"000001F4"一样(当然如果用户只属于Administrator组,结果也是一样了).下面我列出一些组与特殊符号的关系:
Administrators("Ƞ")
Backup Operators("ȧ")
Distributed COM Users("Ȳ")
Guests("Ȣ")
Network Configuration Operators("Ȭ")
Performance Log Users("ȯ")
Performance Monitor Users("Ȯ")
Power Users("ȣ")
Print Operators("Ȧ")
Remote Desktop Users("ȫ")
Replicator("Ȩ")
Users("ȡ")
Debugger Users("无本地登录权限")
HelpServicesGroup("无本地登录权限")
IIS_WPG("无本地登录权限")
TelnetClients("无本地登录权限")

另外说上一句,如果一个用户在"无本地登录权限"的组中,或是在一个由用户创建的组中,或是不在任何的组中,都将不会在该处显示出来.

 

接下来再说一个默认健值的数据类型.大家可能会想,数据类型有什么好说的,我当初也是有这个想法的,只到了"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases\Names\Administrators"项目的默认健值的数据类型时,才知道Microsoft有时会把一些信息放在健值的数据类型上.

在这个项目下的所有默认健数据类型一般只有两种:字符串(REG_SZ);可扩允字符串(REG_EXPAND_SZ).当某个用户只属于一个组时,其默认健的数据类型就是"字符串",一旦这个用户属于两个或两个以上组时,其默认健的数据类型就会改为"可扩允字符串".

/********注释********/

 


2)Names这里面的内容是Windows系统的一些用户组的名称,这些组是Windows系统自身就有的,也就是在刚安装好的系统上就会有的组.

我们随便选择几个组,看一下它的默认值,其中数据为空.不过有一点值得注意,那就是默认值的类型(关于Windows注册表的健值有什么样的数据类型,并且这些特殊类型我们要如何的添加,我将在下一篇文章中写出).

我们认真的看一下所有的组,它们的默认值的数据类型都是不一样的,但又都有一个规律,那就是以0x2开头(0x表示后面的数字是用十六进制表示的),后面再根上一个字节长度的十六进制数据.比如:Administrators为0x220;Backup Operators为0x227;Remote Desktop Users为0x22b.在这我就不写出所有的组了,其它的大家可以自己看一下.

对于每一个相同的Windows操作系统而言(比如都是Windows2003,其它的系统就不知道了),所有系统自身的组在这里的默认值数据类型都是一样的.

那么这个所有组都有的默认值数据类型是什么,有什么意义,又是从什么地方来的,要解答这三个问题,就让我们一起往下看,一起看一下我所分的第三类注册表项目吧.

这在里我还要说上几句,我们在这所看到的所有的组,其实都只是一个映射,像这些组的名字其实只是让我们看的懂一点罢了.而在Windows操作系统中,我们可以认为"组"并不是以组名而存在的,权限也并不是以组名来继承的(像这样的映射关系,在Windows操作系统中可以说是屡见不鲜,比如:"我的电脑","回收站"之类;我们上网时安装的一些插件;还有我后面要说到的用户名).


3)我所说的第三类注册表项目,其实包括了很多的内容,只是它们的结构和功能等等是大致一样的,所以我把它们分为一类.

相信当大家打开HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases时,就已经看到了一些像"00000220"、"0000022B"都是由数字和6个英文字母"A、B、C、D、E、F"组成的注册表项目.这些注册表项目的名称也都是用十六进制表示的,只是没有用"0x"开头而已.

好了,现在大家根这我做一个小小的运动(毕竟东东看多了是会累的).我们用自己的手或纸或尺把这些注册表项目前面的"00000"挡住,看一下右边的内容,是不是觉得有点眼熟呀.相信大家也都想到了,这些项目就是前面我所说的组的映射目标,也就是说Windows操作系统自身的所有组的内容都在这里面.

现在让我们打开00000220项目,我们可以看到这个项目下有两个健值(默认值我们不用看了).其中有一个名称为"C",数据类型为"REG_BINARY(二进制)"的健值,双击打开"C"的编辑窗口.

呀,晕了!一大堆的十六进制,看不懂呀......没有关系,我们找重点看.

首先看第一行"20 02 00 00 00 00 00 00"这是什么内容.对于学过C语言和汇编语言的人来说,我一说就因该明白了,那就是"高高低低".这个词是指计算机内存中的数据存储方式.何为"高高低低",比如一个十六进制的数据为"12345678",这个数据必须是连在一起的,不用分开.这个二六进制数据在计算机内存中排列为"87 65 43 21".好了,我们现在也把这行的内容反过来排列一下"0000000000000220",然后把前面的8个"0"去掉就成的"00000220",和这个项目名称刚好对上.

中间的一大串内容都看不懂,不去管它,向下发展.

接下来我们再把编辑窗口拉到最下,什么?????,在右边的ASCII码中我们可以明显的看到有"Administrators"的存在.没错,这就是组的名称.也就是在"计算机管理"里面显示的组名.在"Administrators"下面还可以看到一些乱码,这些就是该组的描述.不过有一个现像,如果组的描述是由字母、数字、字符组成,那么就可以在这里看到.如果有中文,就没有办法看到中文.不但如此,连ASCII码都和原来的中文ASCII码不一样,不知是Microsoft加密了,还是用了Unicode码,或是其他的编码.

在最后面,有一段内容是这里面的重点."01 05 00 00 00 00 00 05 15 00 00 00 AA A7 AC DB 7B B7 81 52 D2 F3 2A 30"这里面有什么内容呢???其实这里面有什么我也不知道(哪来的这么多水果呀,正好饿了.不是吧!?都是些吃过的),大家不要急,听我往下说.重点其实是在这个数据串的后面"F4 01 00 00",这就是重点中的重点呀,这是什么,这就是"Administrator"(如果你只有一个用户在管理员组的话,如果有多个用户在管理员组就向上找).我为什么看到"F4 01 00 00"就认为是"Administrator"呢,想知道就继续向下发展(不要急).

大家可能会有一个疑问,既然后面才是重点为什么要写出前面的一串数据呢,其时这是有必要的,为什么?这还用我说吗,难道你的计算机只有一个管理员吗?这么一长串的数据其实就是该组下每个用户的分隔符.

 


好了,关于"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin"的说明就先讲到这里,下面看另一个目标.

在"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account"同样也有三个项目:"Aliases"、"Groups"、"Users"

其中Groups的内容我也看不懂,所以就不说它了.继续向下.

在Aliases下我仍然把所有内容分为三类:
1)Members这个项目的真正意义我也不是很清楚,只能大概的设想一下.
在这个项目下有两个子项:S-1-5和S-1-5-21-**********-**********-*********
1.S-1-5子项我也看不太懂,因为它的内容太下了,也没有什么联系.
2.S-1-5-21-**********-**********-*********其中"*"部分为对应的数字,这个数字每一台计算机是不样了,除GOSHT安装版、网络同传外.这一长串的数字因该是指这台计算机的维一的GUID(全球维一标识符)号码.
在这个项目之下的子项是在这台计算机中系统自身的用户账户(也只是个映射).如Administrator(000001F4)、Guest(000001F5)、IWAM_GEXING(000003ED)、SUPPORT_388945a0(000003E9)

2)Names这里面的内容是非Windows系统的一些用户组的名称,这些组是在安装好Windows系统后,再通过安装软件、服务或是用户手动添加的组.该项目内的结构和"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin"下的Names是一样的,大家可以参考一下该处的内容.

3)关于这个类别也没有好说的,大家一样可以参考一下"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin"下的内容,结构也是大致一样了.


下面我接着来说明一下"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users"里的内容.

在Users下只有二个类别:
1)Names这里面是Windows系统中的所有用户名(也只是个映射),不管是系统自身的,还是后面添加的都可以在这里找到.但其真实的内容还是在第二个类别里.

2)这个分类里的内容也没有说的,大致和上面的差不多,只是用户的详细内容是在"V"键值下.而别外的一个"F"键值就实在有点难懂.

有一点,在用户的键值"V"中的开头部分,已经找不到该项目的名称了.

另外在"V"键值内,中间的一部分乱码内容是用户的一些属性设置.

好了,现在大家因该看出来为什么我看到"F4 01 00 00"就知道是"Administrator"用户了吗.答案就在"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4"里.

最后再说一个关于用户密码的存放位置,相信这是大家都关心的一个问题.我个人做了一个小小的试验,先添加一个用户,并备份"V"健值的数据内容,然后设置密码.注销当前用户并以新用户登录需要密码.用管理员登录,导入备份的"V"键值数据内容.再次注销当前用户并以新用户登录,结果如我所料"密码为空".

不过在设置密码或是修改密码后,"F"键值的数据内容都会有4个二进制位的数据有点改变.但可以肯定的是用户的密码不会放在"F"健值中.

 

 

 

有关注册表中"HKEY_LOCAL_MACHINE\SAM\SAM"的内容我就说到这里.
下面我再列出一些我做试验时出现的情况,这样出现同样问题,大家就知道是哪里的问题了.
希望大家不要照着我说的去做,不然出了什么问题我自己也没有什么好的解决方法.
如果大家没有看到图片,有可能是该论坛不支持图片上传,但还有一个最大的可能就是我不会上传(毕竟上论坛不多),请大家多多见谅.
(一)
我在"计算机管理"中添加了一个组,然后把"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Aliases"下有关该组的内容删除,将会出现找不到本地组的错误,如图1.
解决方法:把"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Aliases\Names"下该组的内容删除就不再出现该错误.

(二)
1)我在"计算机管理"中添加了一个用户,然后把"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users"下有关该用户的内容删除,虽然用户仍然可以显示,但打开该用户的属性窗口时,将会出现请求未知目录对象的错误,如图2.并且注册表中关于该用户的内容也不会自动删除.

2)接着删除该用户,又会出现找不到用户名的错误,如图3.

3)然后再删除"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names"下的该用户名,刷新"计算机管理"时出现账户名与安全标识间无任何映射完成的错误,如图4.

4)再添加一个用户,把第1和第3步反过来,得到的出错提示仍然是先图2,后图4.
解决方法:只要重新启动一下计算机,系统会自己删除该用户的信息.

(三)
这是我的一个失误,当时我想通过手动删除注册表中的内容,把"Administrstors"组中的所有用户除"Administrator"外都删除,我没有做好备份,结果当我把"HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases\00000220"下的健值"C"中的"f4 01 00 00"以后的内容都删除后,出现一个有趣的情况:在"计算机管理"中查看"administrators"组中的用户,发现没有用户,添加用"Administrator"用户,提示该用户已经在"Administrators"组.打开"Administrator"用户属性,发现该用户仍然在"Administrators"组中,而且其他的用户也在"Administrators"组中.通过"net user administrator"命令一样可以看到"Administrator"用户属于"Administrators"组.重新启动计算机无法恢复.
最后试着手动一个用户一个用户添加,也都还没有恢复过来.


(四)
1)添加一个用户,把注册表中的该用户的内容导出,并通过"计算机管理"删除该用户.然后导入备份的用户信息,在"计算机管理"中仍然没有该用户.因为在执行删除用户时,把和该用户对应的标识符一起删除了,所以通过手动修改是不能添加用户的.另外也不可以把导出的用户信息改一个用户名就导入,这样同样没有新用户的标识符存在.

 


在试验过程中还出现了一些问题,到现在我想把其他用户通过"计算机管理"从"Administrators"组中删除也都会出现"记录用户 hh 的组成员身份改动时出现了一个多个错误"和"指定的账户名不是本地组的成员"的错误.连最基本的删除一个用户都做不到了.可怜呀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


好了,关于这篇文章就写到这里了.终于知道写文章有多累人了.最后再提醒大家一句,注册表是Windows系统最重要的部分,一般最好不要手动进行修改.如果你一定要改,那么请你一定要先做好备份,不然后果可能比我还要严重也说不定的.

posted on 2008-06-27 09:28  阿栋.c#  阅读(3235)  评论(1编辑  收藏  举报

导航