限制域用户多点并发登录解决方案

 

1 前言

活动目录给企业提供很好的单一用户帐号登录的解决方案,但是并没有提供一个良好的工具帮助管理员控制用户的并发登录,这种设定可能会潜在的影响整个网络的安全性(例如导致资源管理、用户管理、安全审核等一系列问题);

目前活动目录更多的使用于军工等企业,而活动目录中普通域用户的多点并发登录也纳入了测评的范围,所以限制用户的多点并发登录即成为网络管理员必须考虑解决的问题;

多点并发登录指同一账号在同一时间段,登录于多台计算机上,或同一账号在一台计算机登录后未注销的情况下又登录另一台计算机的现象;

2 解决方案汇总

针对于该现象目前总结到的处理方案大约有四种

2.1 方案一:登录到

所谓登录到指微软自带域用户属性,即域用户属性中的登录到属性,该解决方案有如下弊端:

1、 指定后用户登录有俩总方案,A只能登录到某台计算机 B登录到某个计算机组 不太灵活;

2、 需要统计每个用户的账户对应计算机,并在域控制器上分别设定,工作量大(通过台账信息制作批量修改账户属性脚本);

2.2 方案二:LimitLogin

LimitLogin是微软专门为Windows Server 2003量身定做的一个登录管理工具其功能包括:

1、 限制域内各台计算机每个用户的登陆次数,包括终端服务器会话。

2、 按照明确的规则(如一个特殊客户端或域控制器的所有登陆会话,或所有计算机中某个正在登陆的用户),显示域内每个用户的登陆信息

3、 整合Active Directory MMC(Microsoft Management Console,微软管理控制台)snap-ins(嵌入式管理单元),方便管理和设置

4、 删除和注销来自Active Directory Users和Computers MMC snap-in的远程用户会话

5、 依照CSV (Excel)XML格式产生登陆报表

事实上,在一个分布环境限制当前登陆是相当困难的。虽然LimitLogin不是这方面的全能解决方案,但仍然在银行,ISP,图书馆等领域受到众多用户的青睐。

由于该工具只支持WindowsServer2003所以此处不做过多简绍,给出部分链接信息方便需要的朋友查阅;

LimitLogin详简

http://support.microsoft.com/default.aspx?scid=kb;EN-US;237282

下载地址

http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/limitlogin.exe

2.3 方案三:USERLOCK(第三方软件)

USERLOCK是第三方工具,该软件可以很好的解决我们所讨论的问题,也是本人最推荐的方法,但该软件是付费软件,按管理的客户端数付费,每个 license(授权)约12欧元;

该工具可以实现如下几大模块的管理:限制并发登录、工作站限制、时间限制、时间配额、实时监控和警报、生成报告、远程会话管理、用户安全意识、个性化的免责声明;

由于是付费软件,故而用户不是太多,并且其官方有详细的解决方案文档,此处不做太多简绍给出相关链接,方便需要的朋友查阅;

官方网页链接

http://www.isdecisions.com.cn/userlock

软件下载地址

http://www.isdecisions.com.cn/userlock/download/

2.4 方案四:登录脚本

该方案也是我们今天着重讲的方案,主要由于其免费,但该方案有诸多不严谨不推荐在生产环境下使用,脚本原理为在用户在登录的时候像指定的服务器发送一条登录信息,保存到以该用户名命名的文件中,在注销的时候继续像该文件中发送一条注销信息,该用户在第二次登录或者在第一次登录还未注销的时候登录,会首先检查服务器上以该用户名命名的文件中有没有该用户的注销信息,若没有说明该用户已经登录则禁止继续登录,若有注销信息则说明该用户此时还未登录则可以继续登录;

2.5 操作步骤

1、 在指定的文件服务器上建立共享,例如域控制器上,可以是隐藏共享(修改脚本中的共享路径也即加$);例如本环境域控制器兼文件服务器IP地址是192.168.10.1;登录服务器建立名称为ClientLogon的共享文件夹,共享权限为所有人可读写;

clip_image001

6、 如下图并按实际情况修改脚本内容(右键编辑即可,红色部分为目标文件夹共享路径);

clip_image003

7、 登录域控制器新建组策略对象(GPO),配置用户登录脚本为login.vbs注销脚本为logoff.vbs(脚本内容在后面附录);

clip_image005

8、 配置完成后登陆客户端,执行命令Gpupdaet /force刷新组策略,然后注销重新登;

clip_image006

9、 登录后此时在指定的文件服务器(本案例为域控制器)共享文件夹内几多出了以各用户名命名的日志文件;

clip_image007

10、测试,首先用userb在A机器上登录不注销,此时在B机上使用userb的账号再次登录,结果如下;

clip_image009

11、如下图即为某用户日志文件中的内容;

Logon 记录表示是某用户于某时间成功登录了哪台工作站

Logoff时 记录表示的是某用户于某时间成功从哪台工作站注销了。

FailLogon则记录的是登录失败的信息(即表示有用户使用该账户在其他机器登录时发现该账户还未注销)

clip_image011

2.6 使用注意点

1、 用户在关机前需要点击注销;

2、 用户物理关机,或者意外断电等情况,会导致用户登录日志中只有登录信息没有注销信息,当用户再次合法正确的登录则会报警该用户已经登录,解决办法是管理员将其日志文件中最后的登录记录删除或者手动添加一条注销记录或者直接将对应用户的登录日志文件删除;

2.7 附录,案例中的脚本内容

login.vbs中的内容(将下面的内容复制到记事本保存为后缀为.vbs的文件即可)   

Dim oNet, sUser, sComputer, ServerLog

ServerLog = "\\192.168.10.1\ClientLogon\"

Set oNet = CreateObject("Wscript.Network")

sUser = oNet.UserName

sComputer = oNet.ComputerName

Set oNet = Nothing

Dim fso, f1, WshShell, argu, alllog, lastlog

Dim FileName

FileName=ServerLog & sUser & ".txt"

Set fso = CreateObject("Scripting.FileSystemObject")

If Not (fso.FileExists(FileName)) Then

Set f1 = fso.CreateTextFile(FileName,True)

f1.WriteLine sUser & " " & sComputer

f1.Close

Set WshShell = Wscript.CreateObject("Wscript.Shell")

argu = FileName & "/T/E/G" & sUser & ":f /R Everyone"

WshShell.run("cacls " & argu)

Set WshShell = Nothing

End If

Set f = fso.GetFile(Filename)

intSizeB = f.Size

if intsizeB=0 then

alllog = ""

lastlog = ""

end if

if intsizeB>0 then

set f1=fso.OpenTextFile(Filename,1,True)

alllog = f1.readall

f1.close

set f1=fso.OpenTextFile(Filename,1,True)

lastlog = f1.readline

f1.close

end if 

If Left(lastlog, 5) = "logon" Then

If InStr(lastlog,sComputer) < 1 Then

Set f1 = fso.OpenTextFile(FileName, 2, True)

f1.WriteLine (lastlog & Chr(13) & Chr(10) & "FailLogon:" & Now() & " " & sUser & " at " & scomputer & Chr(13) & Chr(10) & alllog)

f1.Close

Set WshShell = Wscript.CreateObject("Wscript.Shell")

Dim i,OldComputer

i=InStr(lastlog,"at")

OldComputer=Right(lastlog,Len(lastlog)-i-2)

WshShell.popup "对不起:此账号已经在 " & OldComputer & " 上登入使用!出现此提示的可能情况如下:1、您在其他电脑上登陆的帐户未及时注销。2、您上次非法关闭计算机或者意外停电。3、如果您确认未发生上述2种情况请及时上报信息中心支持,谢谢!!!" , 30

Set WshShell = Nothing

Dim os, retcode

For Each os In GetObject("Winmgmts:{impersonationLevel=impersonate,(shutdown,remoteshutdown)}!//" + sComputer).InstancesOf("Win32_OperatingSystem")

retcode = os.Win32ShutDown(4, 0)

Next

Wscript.quit

Else

Set f1 = fso.OpenTextFile(FileName, 2, True)

f1.WriteLine ("logon: " & Now() & " " & sUser & " at " & sComputer & Chr(13) & Chr(10) & alllog)

f1.Close

End If

Else

Set f1 = fso.OpenTextFile(FileName, 2, True)

f1.WriteLine ("logon: " & Now() & " " & sUser & " at " & sComputer & Chr(13) & Chr(10) & alllog)

f1.Close

End If

Set f1 = Nothing

Set fso = Nothing

Wscript.quit

 

logoff.vbs中的内容(将下面的内容复制到记事本保存为后缀为.vbs的文件即可)   

dim oNet,sUser,sComputer,ServerLog

ServerLog = "\\192.168.10.1\ClientLogon\"

set oNet=createobject("Wscript.Network")

sUser=oNet.UserName

sComputer=oNet.ComputerName

set oNet=nothing

dim fso,f1,alllog,lastlog

Dim FileName

FileName=ServerLog & sUser & ".txt"

set fso=createobject("Scripting.filesystemobject")

If Not (fso.FileExists(FileName)) Then

Set f1 = fso.CreateTextFile(FileName,True)

f1.WriteLine sUser & " " & sComputer

f1.Close

Set WshShell = Wscript.CreateObject("Wscript.Shell")

argu = FileName & "/T/E/G" & sUser & ":f /R Everyone"

WshShell.run("cacls " & argu)

Set WshShell = Nothing

End If

Set f = fso.GetFile(Filename)

intSizeB = f.Size

if intsizeB=0 then

alllog = ""

lastlog = ""

end if

if intsizeB>0 then

set f1=fso.OpenTextFile(Filename,1,True)

alllog = f1.readall

f1.close

set f1=fso.OpenTextFile(Filename,1,True)

lastlog = f1.readline

f1.close

end if

if left(lastlog,5)="logon" Then

If InStr(lastlog,sComputer) > 0 Then

Set f1=fso.opentextfile(FileName,2,true)

f1.writeline("logoff: " & Now() & " " & suser & " at " & scomputer & Chr(13) & chr(10) & alllog)

f1.close

End If

end if

set f1=nothing

set fso=nothing

wscript.quit

 

2.8 附录,案例中脚本下载地址

http://pan.baidu.com/share/link?shareid=3411595778&uk=3627816260

上述为本人目前总结到的解决方案,如果您有更好的解决方案可留言提出,旨在得出更合理、更合适生产环境的解决方案;

你可能感兴趣的:(限制域用户多点并发登录解决方案)