计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第12期 vol.25 No.12 1999



使用协议分析排除登录Win NT故障
李德鹏　王应龙　李德胜
　　Windows NT是最近几年由微软公司推出的网络操作系统，一如微软公司的PC操作系统平台，由于Windows NT注重用户化，易使用，易维护，因此深受用户青睐。Windows NT迅速抢占网络操作系统市场份额，成为网络管理人员的首选平台。作为最好的应用服务器，Windows NT支持众多的数据库产品、图形化界面、直观、易学、容易配置，它众多灵巧的管理工具成为网络管理人员不可缺少的好帮手。另外，每个运行程序独自占有内存空间，在一个运行程序出现故障的情况下，不会造成服务器死机，大大提高了服务器的无故障运转时间。当前用户的组网模型一般采用Win 95(98)作为工作站端操作系统，Windows NT作为服务器端操作系统。工作站通过登录域控制器共享网络资源。本文简单介绍客户端登录服务器的操作过程。希望对网络软件设计人员进行软件设计、网络管理人员进行网络维护的过程中有所帮助。
1 Windows 95登录Windows NT服务器过程
　　Windows NT采用工作组或者域的方式管理网络资源。域是计算机和用户的逻辑组。在域中，所有计算机访问存储安全和用户帐号信息的中心数据库由作为域控制器的NT服务器进行管理。当一个用户登录一个域时，域控制器通过检查域的目录数据库所存储的用户名、口令、登录限制来确定登录是否有效。具体地说，当一个用户登录域时，要完成以下步骤，图1为演示图：

图1 用户登录演示图
　　① 客户端程序Win Logon请求客户输入用户名和口令，然后该程序将得到的数据发送给安全子系统的LSA(Local Security Authority)；
　　② 安全子系统将请求发送给客户端的Net Logon服务；
　　③ 客户的 Net Logon服务将请求发送给域控制器的NetLogon服务；
　　④ 域控制器的Net Logon服务发送请求给域控制器的SAM(Security Accounts Manager)；
　　⑤ SAM检索域服务器中中心目录数据库，寻找匹配的用户名、口令；
　　⑥ 域控制器的SAM服务把结果传输给域控制器的Net Logon服务；
　　⑦ 域控制器的Net Logon服务将结果传给客户端的Net Logon 服务；
　　⑧ 客户的Net Logon服务将把结果传给客户的LSA；
　　⑨ 如果传回的结果有效，客户的LSA建立一个访问令牌，包含赋予的权限，把令牌传给客户的Win Logon处理；
　　⑩ Win Logon为用户请求一个新的处理，并且为新处理附加访问令牌。
　　由以上过程可知，步骤①、②、⑧、⑨、⑩是发生在工作站的内部，而步骤④、⑤、⑥是发生在服务器端的内部，仅有③、⑦发生在工作站、服务器之间的网络传输中。
2 Windows 95登录Windows NT过程中协议消息 互相传送过程
　　上面讲述的步骤③、步骤⑦仅仅是大致的原理实现，具体工作站和服务器之间如何互相识别、如何建立联系的过程要比上面所说的复杂的多。
2.1 CIFS客户登录CIFS服务器的3个逻辑步骤
　　Win 95登录Win NT的过程就是CIFS client登录CIFS server、通过安全检查的过程。CIFS客户登录包含3个逻辑步骤：
　　(1) 域控制器的发现
　　域控制器的发现是CIFS客户寻找域控制器的过程。通过使用MailSlot和NetBIOS命名来完成这一功能。MailSlot提供快速、不可靠、非双向的数据传输机制。一旦某过程获得对MailSlot的控制，就可以像写文件一样写MailSlot，使用CIFS Transact SMB将数据放在数据区中发送数据包。在寻找主域控制器时，客户发送包含NETlogon_QUERY帧的MailSlot信息，然后等待响应。如果超过延迟时间仍然没有得到响应数据包，请求信息将再次发送，延迟时间调整为正常延迟的两倍，再超时，延迟时间再加倍。如果多次重传之后没有收到响应，那主域控制器的名称将被认为不可到达。并且在过一段时间之后重新发送，一般是一分钟的时间，每次超时后，延迟等待时间将加倍。如果收到响应，主域控制器的名称将保存下来以备将来使用。
　　NetLogon_Query结构定义如下：
　　struct NetLogon_Query{ 
　　　unsigned　char Opcode;/*表示该结构是一个NetLogon_ 
　　　　　　　　Query ，数值为7*/
　　　char ComputerName;/*发送请求的计算机ASCII名称*/
　　　char MailslotName;/*响应信息发给的MailSlot ASCII名称*/
　　　unsigned short Lm20Token; /*为0XFFFF*/
　　　} ;
　　struct NetLogon_Response
　　{ 
　　　　unsigned char Opcode;/*表示该结构是响应数据包，一
　　　　　　　　　般是0X12*/ 
　　　　char PrimaryDCName[16]; /*如果通过权限审查，返回
　　　　　　主域控制器的ASCII名称*/ unsigned short Lm20Token; /*为0XFFFF */ 
　　}
　　;应当特别提出注意的是，查找主域控制器的过程占用很大的网络带宽，存储响应信息所提供的主域控制器名称可以缓解资源的紧缺。原因在于在搜索主域控制器之前，可以用NetServeEnum2 API进行检查，确保是否已经有存储的PDC名称存在。
　　(2) 会话设置
　　CIFS客户向刚刚发现的主域控制器发送Seaaion-SetupAndX SMB请求，然后接受符合CIFS规范的响应。SeaaionSetupAndX SMB响应指出主域控制器对请求的认可或不认可，但是可以以GUEST方式登录。之后就可以执行磋商SMB数据包往返发送了。
　　(3) 远程API执行
　　本文不涉及远程API执行的细节。
2.2 CIFS客户机登录CIFS服务器的协议具体收发过程
　　CIFS服务器在用户登录的过程中，要检查是否允许用户登录，在某时间段是否允许某用户登录，在CIFS客户登录的参数中，预留口令字段，客户机将口令填充入该字段。CIFS服务器检查用户名、口令是否与帐号数据库中的值相符。如果没有设置口令，该字段内容被置为NULL，但是CIFS服务器将检查SMB中的用户名、机器名，是否符合检查要求。具体的CIFS客户机登录服务器的协议收发过程如下：
　　. CIFS客户向CIFS服务器发送磋商SMB；
　　. CIFS服务器检查高速缓存的域控制器名称；* 如果没有发现有效的域控制器名称，则做一个域控制器发现；
　　. CIFS服务器发送磋商 SMB 给域控制器；
　　. 磋商响应和挑战保存在CIFS服务器中；
　　. CIFS服务器使用保存的挑战发送磋商响应给客户；
　　. CIFS客户按照CIFS规范的详细要求写出挑战响应,并且挑战响应作为 SessionSetupAndX SMB的一部分发送；
　　. CIFS服务器由上述SMB中精选出挑战响应；
　　. CIFS服务器使用精选的挑战响应发送自己的 SessionSetupAndX SMB给域控制器；
　　. 域控制器发送 SessionSetupAndX响应给CIFS服务器。如果CIFS客户提供正确的响应，则响应是正常的；
　　. CIFS服务器断开同域控制器之间的连接，则通过一个 LogOffAndX SMB完成；
　　. CIFS服务器发送 SessionSetupAndX响应给CIFS客户。这个域控制器响应。
　　掌握以上协议收发过程，可以更加了解客户机登录服务器的过程。
3 分析客户无法登录的问题
　　某台Win95工作站始终无法登录Win NT服务器。采用多种替换法都没有解决问题。使用了该协议分析，参照CIFS登录方法，发现由于网卡驱动程序的原因，使客户机无法成功发送SMB处理包，导致客户机无法登录服务器。
　　在工作站登录服务器时，如果出现性能低下，速度奇慢，也可以采用该方法研究。究竟是工作站没有发出正确的请求包，还是服务器在接到请求数据包后很长时间才作出反应，还是数据在网络传输过程中速度慢，造成整个网络的瓶颈；通过定位网络问题发生在哪个环节，就可以很快地定位网络故障的原因了。
作者单位：李德鹏　王应龙　山东省计算机网络重点实验室，济南250014
　　　　　李德胜　工商银行济南分行科技处，济南250014
参考文献
1 Microsoft. Supporting Microsoft Windows NT 4.0 Core Technologies. 北京：机械工业出版社，1997
2 Tanenbawm A S. Computer Networks(3rd Ed).北京：清华大学 出版社，1996
3 Naik D C，Leach P J.Microsoft. CIFS Domain Logon and Pass Through Autentication. Internet Draft，1997-01
