Windows管理员的三大心愿之一限制Windows用户的并发登录
2009-10-29 00:00:00 来源:WEB开发网这个脚本看起来有点复杂。但是,它工作得很好。除了程序本身,管理员还需要做二项工作。首先,为每个用户的主目录(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,这往往意味着指定的用户名已经在另一台计算机中登录,当然你可以要求另一台计算机注销。为此,你可以在用户的登录脚本中添加以下几行: