解开拒绝本地登录的“死结”

来源:互联网 发布:西晋知乎 编辑:程序博客网 时间:2024/04/28 18:15
作者:朱其胜 来源:微软中国社区

目录
前言
被域策略拒绝本地登录时的解决办法
被本地安全策略拒绝本地登录时的解决办法
secedit简介
补充说明
参考资料
关于作者

--------------------------------------------------------------------------------

前言
在Windows 2000环境下,被组策略拒绝本地登录一直是件比较令人头疼的事情。本文将介绍一种所有用户都被拒绝本地登录后的解决方法。
在Windows2000中,如果某个用户被取消了本地登录权限,当这个用户本地登录计算机时,系统就会提示"此系统的本地策略不允许您采用交互式登录",导致登录失败。遇到这种情况,通常请管理员在组策略中重新设置一下,将该用户从"拒绝本地登录"列表中删除或添加到"在本地登录"列表中即可。但如果因为操作失误或其它方面的原因,我们将所有用户的本地登录权限都禁止了(通常是禁止了users组(非域环境下)或domain users组(域环境下)),那就有点麻烦了。这种情形看起来像一个解不开的"死结":要解除禁止本地登录的组策略设置,必须以管理员身份本地登录;要以管理员身份本地登录,就必须先解除禁止本地登录的组策略设置。
但实际上,事情并没有我们想象的那么糟。经过查询相关资料和测试,我发现借助网络的帮助,这个"死结"还是可以解开的。因为域安全策略与本地安全策略的数据保存机制不同,下面分两种情况分别进行说明。

--------------------------------------------------------------------------------

被域策略拒绝本地登录时的解决办法
域策略的安全设置部分都保存在一个名为"GptTmpl.inf"的安全模板中,这是一个文本文件,存放在DC(域控制器)的SYSVOL(物理目录指向DC的“c:/winnt/sysvol/sysvol")共享中。要解除对所有用户本地登录限制,在不能本地登录的情况下,最快捷的办法可能就是直接编辑这个文本文件。
具体操作如下:
在另一台计算机(Win9X/2000/XP均可)上,使用域管理员账号连接到DC的SYSVOL共享,在"//<DC name>/sysvol/<Domain name>/Policies/<policy GUID>/MACHINE/Microsoft/Windows NT/SecEdit"下找到该文本文件"GptTmpl.inf"。(路径中的"DC name"是你放置该组策略的域控制器的名字,"Domain name"是你的域的名字,"Policy GUID"是你要编辑的组策略对象的GUID,类似于"{31B2F340-016D-11D2-945F-05C04FB98439}")。
使用记事本打开"GptTmpl.inf"文件,找到文件中"Privilege Rights"小节下的 "SeDenyInteractiveLogonRight"关键字,它的值就是被拒绝本地登录的用户或组的SID,将这些SID删除,使 "SeDenyInteractiveLogonRight"关键字的值为空。修改完毕将文件保存回原位置。
使用记事本打开位于"//<DC name>/sysvol/<Domain name>/Policies/<policy GUID>"下的 "GPT.INI"文件,提高"General"小节下的"Version"关键字的值,通常是加1000。这是我们修改的这个组策略对象的版本号,版本号提高后可以保证我们的更改被复制到其它DC上。修改完毕将文件保存回原位置。
域策略刷新后,问题即告解决。
本地登录DC重新设置域策略中的相关项目。

--------------------------------------------------------------------------------

被本地安全策略拒绝本地登录时的解决办法
由于在Windows2000中,不支持对计算机本地策略的安全设置部分进行远程管理(详见组策略白皮书),而且本地安全策略的安全设置通常存放在一个二进制的安全数据库secedit.sdb中,这个安全数据库的结构我们无从知道,因此象第一部分那样直接编辑secedit.sdb文件的办法是无能为力了,我们需要采用迂回进攻的策略,"曲线救国"。
具体操作如下:
假设故障计算机的IP地址是"192.168.0.111"。在另一台计算机(Windows9X/2000/XP均可)上,使用"Telnet 192.168.0.111"命令使用管理员账号连接到故障计算机。(如果故障计算机的telnet"服务没有启动,可以通过网络使用"服务"MMC启动,具体方法不在详述)
通过telnet在故障计算机上执行"net share tmp$=d:/tmp"命令,将故障计算机上的"d:/tmp"隐藏共享为"tmp$",共享权限缺省是everyone完全控制(此时要特别注意网络安全)。当然你也可以共享其它的目录。
通过telnet在故障计算机上执行"secedit /export /CFG d:/tmp/sec.inf"命令,将故障计算机的本地安全策略配置导入"d:/tmp/sec.inf"安全模板文件中,这是一个文本文件。
连接到故障计算机上的tmp$共享,用记事本打开共享文件夹中的"sec.inf"文件。找到文件中"Privilege Rights"小节下的“SeDenyInteractiveLogonRight"关键字,它的值就是被拒绝本地登录的用户或组的SID,将这些SID删除,使"SeDenyInteractiveLogonRight"关键字的值为空或者是随便另设置一个无关的值。文件修改完毕保存回原位置。
通过telnet在故障计算机上执行"secedit /configure /db c:/secedit.sdb /CFG d:/tmp/sec.inf"命令,使用新的安全模板和安全数据库重新配置故障计算机的本地安全策略。
通过telnet在故障计算机上执行"secedit /refreshpolicy machine_policy /enforce"命令,强制在故障计算机上刷新策略设置,问题即告解决。
本地登录故障计算机后,删除我们建立的Tmp$共享,重新设置本地安全策略中的相关项目。

--------------------------------------------------------------------------------

secedit简介
secedit.exe,Windows2000自带的自动化安全配置任务命令行工具,功能强大。我们可以用它来分析系统的安全性、配置系统安全性、刷新安全性设置、导出安全性设置和验证安全配置文件。它的具体用法请使用"secedit /?"查看其帮助文件。

--------------------------------------------------------------------------------

补充说明
上面所说的两种方法,都是以有权限用户(如管理员)没有被禁止从网络登录为前提的,如果你的策略把从网络登录也禁止了,让故障计算机成了真正的"孤家寡人",那问题解决起来要麻烦的多,但同样不是一个解不开的"死结"。具体的解决办法,我会另具文说明,在此不再细说。

--------------------------------------------------------------------------------

参考资料
参考资料1:微软KB数据库文章Q226243、Q257346、Q267553。
参考资料2:微软msnews新闻组microsoft.public.win2000.setup、security和general。
参考资料3:Windows2000中文帮助。

--------------------------------------------------------------------------------
原创粉丝点击