查看文章 |
原帖http://bbs.duba.net/viewthread.php?tid=22035421,25楼回复 在铁军blog上看到这一系列金山客服内部考试题,其中这一题,我认为大家比较容易犯错。 以下哪个修改过的userinit键值的数据会导致用户开机反复注销 答案是A。这是一个极具迷惑性的题目。迷惑项目主要是C。因为一般的答题者通常会认为,由于病毒跟随userinit.exe启动,才导致了反复注销。其实这种理解是错误的。 具体到本题,相关注册表键位于 因此,这个键值不支持A选项这种包含环境变量的设置方法。当系统启动过程中读取这个键值时,没有办法将其中的%systemroot%当成环境变量并转化为WINDOWS文件夹的路径,于是导致系统找不到userinit.exe文件,不能启动userinit.exe,因此用户会遭遇登录后立即注销的问题。 REG_SZ与REG_EXPAND_SZ类型的某些区别是经常被我们忽略的问题,比如SREng的启动项添加和编辑功能,默认只是创建REG_SZ类型的,因此不支持环境变量。 然而事情是不是如此简单?未必。因为在注册表键值中使用环境变量,不单单要考虑键类型的问题,在某些条件下还要考虑这个环境变量是否已经被初始化的问题。 环境变量一般分为系统环境变量和用户环境变量。从系统启动到成功创建用户会话,到用户终于可以看到桌面的过程中,系统环境变量和用户环境变量的初始化是在不同的阶段进行的。 系统环境变量的初始化,是由会话管理器smss.exe完成的。smss.exe完成初始化后,创建csrss.exe和winlogon.exe进程,winlogon.exe进程再创建其他用户态进程。 userinit.exe进程是由winlogon.exe创建的,执行用户环境的初始化工作,完成如环境变量初始化、运行登陆脚本和应用安全策略等任务后运行缺省的Shell,即explorer.exe 从以上的两段中,你看出了什么?对了,在userinit.exe被启动之前,用户环境变量未被初始化,已被初始化的只有系统环境变量。 因此,即使Userinit键的类型是REG_EXPAND_SZ,也不代表它能使用所有的环境变量。这说明,在我们对系统的修改涉及到系统启动过程的时候,我们的考虑应该更加细致。 |