RSS
热门关键字:  下载  cms  模版  开源  dedecms
当前位置 :| 主页 > 站长学院 > 服务器 >

限制Windows用户的并发登录

来源:互连网 作者:佚名 时间:2005-10-20 Tag: 点击:

   可能就是这篇文章的题目吸引了你,也可能你曾经也有过同样的心愿—管理并限制Windows网络中的用户登录限制。而且你曾经为此一筹莫展,渴望解决Windows网络中因为用户任意登录所导致资源管理,用户管理,安全审核等一系列问题。我在这里(包括下文,有时也会称为并发登录)所提到的任意登录是指同一时间,同一个用户账号在不同的计算机上同时登录的现象,或者说是在一台计算机登录,在完成工作后并未注册但又在另一台计算机上登录的现象,并不是指任何时间,任何地点在一台计算机上登录的现象。如果你曾经管理过Novell网络,后来转换到Windows网络,你会因为Windows没有提供这种机制而对那些不守规矩的用户行为感到无可奈何。因为作为一名Novell管理员非常清楚,限制用户账号的并发登录,仅仅是NDS(Novell Directory Service,Novell目录服务,与Windows 2000中的Active Directory一样,旨在提供一种单点登录,统一资源管理的手段,都是基于X.500标准设计,但NDS的某些方面可能强于Windows 2000的Active Directory,并发登录限制就是一个典型)对象的一个“Check Box”,唯一要做的是Enable或者是Disable。
    用户账号在同一时间内并发登录,所产生的最大问题还是与内部或者外部网络的安全相关。例如,你是一个网络的管理员,你为自己创建了一个登录账号,因为平时管理工作的需要,你给这个账号添加了足够的权限,而且你坚信:我的网络是安全的,我的同事也是相互尊重,不会利用别人的账号作任何事情的。为了自己方便记忆(或者说登录时输入简单),你设置了一个很容易记忆(比如,123456或者与你的用户名相同),但就是因为Windows网络没有并发登录限制机制,那些对网络特权账户充满好奇心(因为他知道有特权可以做很多事情),或者平时对你稍有不满的用户试图利用你的账号做什么事情(因为你设置的密码简单,容易被猜到,而且你还相信他们不会做什么),你都无法知道,这尤如恶梦一般。那怕你设置了安全审核,但审核结果还是你自己的登录账号,这显然是Windows没有并发登录限制所导致的问题。
    直到现在的Windows 2000为止,Microsoft都没有在系统中内置限制用户并发登录的机制(如果你已经预览过Windows Server 2003,你会发现它也没有这种机制)。当然,Microsoft并不是没有倾听用户的心声,因此,Microsoft在他的Windows 2000 Resource Kit中提供了一个程序来实现这种功能,试图来掩盖普天之下众多Windows管理员的谴责声。显然,Microsoft在这方面已经向前迈进了一大步,通过本文你会了解到,到目前为止,Microsoft究竟提供了一个怎么样的解决方案,这个解决方案是否已经一呼百应,实现了Window管理员多年来的夙愿,当然包括我。首先,我们来回顾一下在没有Microsoft自己的解决方案之前,我们Windows管理员自己是如何尝试着解决这个问题的。
    一、脚本程序
    作为一名Windows管理员,想必你肯定知道脚本在日常管理工作中的重要性,比如,批量创建用户。而且我们还知道,利用脚本可以为用户创建登录脚本,在登录脚本中,你可以为用户映射网络驱动器,连接打印机等等。聪明的Windows管理员就是利用脚本第一次实现了并发登录限制,让我们一起看看是如何实现的。
    使用Kixtart脚本处理器制作如下的一个脚本程序。Kixtart是一个可以运行在Windows各个版本上增强的脚本处理引擎。如果你要测试文章中的脚本程序,你需要安装Kixtart程序。有关Kixtart的详细信息,可以访问http://kixtart.org/站点。与Kixtart配合使用的部分程序,请到对应的操作系统安装盘中相应的support目录或者Resource中查找。
    注意,脚本程序中的Onlyonce.txt是保存在Netlogon共享目录中,它一般包括一些警告与说明信息,可以任意定义。
    这个脚本看起来有点复杂。但是,它工作得很好。除了程序本身,管理员还需要做二项工作。首先,为每个用户的主目录(Home Directory)创建一个隐藏共享,指定只有这个用户可以访问并且仅允许一个用户访问(这个很重要)。其次,在用户主目录中创建一个%username%.txt文件,并且指定仅对这个用户具有读取权限。
    从上面简单的解释中大家应该已经猜到脚本实现的原理,非常简单:限制主目录仅允许一个用户访问,如果同一个用户在没有注销的前提下尝试登录,映射网络驱动器将失败,系统显示Onlyonce.txt中的内容,然后调用shutdown防止用户登录。
    我想精明的读者已经发现NTName/NTName2正常运行时会受到的威胁—主目录的服务器关闭时,用户将可以任何登录,你再也无法阻止他们的这种行为。另一个缺陷就是当另一个用户故意或者偶然地连接到其他用户的主目录,在他不离开(尽管拒绝他访问,但已经连接)的情况下,主目录的所有者将不能登录(因为已经设置同时仅限一个用户连接)。
    二、一个更简单的手段
    Windows管理员们在不断地寻找更好的解决方案。所有的努力并没有白白浪费,终于有了更好的选择。NTName—一个Windows NT网络中限制用户账号并发登录的实用程序,我们可能不记得是由哪位Windows管理员编写的,但我们肯定可以发现这个比前面的脚本程序有很大的进步。与NTName程序配套使用的是Logout程序,一个强制注销的程序。让我们粗略地看一下NTName的实现。
    当你登录到NT网络时,计算机会添加一个由你的用户名组成的NetBIOS名字,名字是唯一的,因此同一时间内它只能存在于一台计算机上,在计算机中的Byte 16值等于0x03,这个名字用来在网络中广播信息,比如,假设你已经要求打印作业完成后显示消息,Windows网络就根据你登录时产生的NetBIOS名字决定你当前登录的计算机,并显示已经完成的消息(你可以测试,假如你并发登录20个用户,只会有一台计算机接到这个消息。)。NTName就是根据这个原理来实现的,在程序运行时,它把用户名作为一个参数处理,检查这个名字是否属于当前计算机所有。如果没有任何输出,就返回ErrorLevel 0。如果输入了名字所属的系统名称,返回ErrorLevel 1,这往往意味着指定的用户名已经在另一台计算机中登录,当然你可以要求另一台计算机注销。为此,你可以在用户的登录脚本中添加以下几行:


NTName %USERNAME% >%TEMP%\LOGONEDPC.TXT ;重定向到logonedpc.txt文件
If not errorlevel 1 goto Logon_OK
For /f %%f in(‘TYPE %TEMP%\LOGONEDPC.TXT’) do @echo 已经登录到%%f %0..\logout.exe
:Logon_OK






CLS
AT (1,1)
If @INWIN = 2 ; 表示客户计算机是Windows 95/98
$L = "@LSERVER" + "\" + "NETLOGON" + "\" + "WINSET.EXE"
shell "$L USERNAME=@USERID"
shell "$L HOMEDRIVE=X:" ; 你为用户映射的网络驱动器
shell "$L HOMEPATH=@HOMEDIR"
shell "$L HOMESHARE=@HOMESHR"
shell "$L COMPUTERNAME=@WKSTA"
shell "$L USERDOMAIN=@DOMAIN"
shell "$L LOGONSERVER=@LSERVER"
shell "$L USERPROFILE=@HOMESHR"
shell "$L OS=Windows_98"
setl "USERNAME=@USERID"
setl "HOMEDRIVE=X:"
setl "HOMEPATH=@HOMEDIR"
setl "HOMESHARE=@HOMESHR"
setl "COMPUTERNAME=@WKSTA"
setl "USERDOMAIN=@DOMAIN"
setl "LOGONSERVER=@LSERVER"
setl "USERPROFILE=@HOMESHR"
setl "OS=Windows_98"
endif
If @WKSTA <> "@LSERVER" ; 如果客户的工作站不是这台计算机
settime "@LSERVER" ; 把工作站的时间设置成服务器时间
endif
use X: "@HOMESHR" ;这是Kixtart中自带的Net use命令
$S = "@LSERVER" + "\" + "NETLOGON" + "\" + "users.txt"
IF INGROUP("users") and EXIST("$S")
Display "$S"
AT (23,1) "按任何键继续"
GET $A
endif
$B = "@LSERVER" + "\" + "NETLOGON" + "\" + "LOGBAT.BAT"
shell "$B"
CLS
BIG
$X = 1
DO
COLOR w/n
AT ( $X,$X*2 ) "@USERID"
$X = $X+1
UNTIL $X = 6
COLOR g+/n
AT ( $X,$X*2 ) "@USERID"
sleep 3
AT (23,0)
SMALL
$K=”@LSERVER”+”\”+”NETLOGON”+”\”+Onlyonce.txt”
$J=”x:\”+”@USERID”+”.txt”
if exist(“J$”)
goto done
endif
CLS
Display “$K”
Sleep 3
$RC=shutdown(“”,”正在关闭系统!”,0,1,0)
:done
cookie1 ; 需要通知Windows 98计算机当通过LMSCRIPT时脚本已经运行完毕
exit

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
热点关注
相关文章