限制用户多点并发登录之 “脚本”篇

释放双眼,带上耳机,听听看~!

限制用户多点并发登录之

“脚本”篇

废话就不多说了,请看如下操作 :

1) 打开 GPMC,为 Test OU 创建并链接一条名为“限制用户多点并发登录”的

GPO。如图 1 和 2 所示。如果没有安装 GPMC组策略管理控制台, 请直接在 Test OU

右键属性上创建并链接一条

GPO。

2) 将以下内容分别存为 logon.vbs 和 logoff.vbs

以下内容请存为 logon.vbs

Dim oNet, sUser, sComputer, ServerLog

ServerLog = "\\dc.a.com\log$\"

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 f1 = fso.OpenTextFile(FileName, 1, True)

alllog = f1.readall

f1.Close

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

lastlog = f1.readline

f1.Close

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 & "

上登入使

用!出现此提示 , 说明你的账号已经在其它计算机上登录使用,请在其它计算机

上注册后再在此计算机上使用,谢谢合作!!!

" , 30

Set WshShell = Nothing

Dim os, retcode

For Each os In

GetObject("Winmgmts:{impersonationLevel=impersonate,(shutdown,remotes

hutdown)}!//" + 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

dim oNet,sUser,sComputer,ServerLog

ServerLog = "\\dc.a.com\log$\"

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")

set f1=fso.opentextfile(FileName,1,true)

lastlog=f1.readline

f1.close

set f1=fso.opentextfile(FileName,1,true)

alllog=f1.readall

f1.close

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

说明:

  1. 运行该登录和注销脚本后,会在共享文件夹中写下

log 文件,其中记录了域

用户在工作站上的登录注销记录

  1. 请确保用户对共享文件夹有合适的写权限,否则脚本运行肯定报错
  2. 脚本中共享文件夹路径

,请替换为自己实际的路径,最好

为共享文件夹设置为隐藏共享,避免用户浏览到里面的内容而加以改动

3) 编辑“限制用户多点并发登录”策略,找到“用户配置”

“Windows设

置” “脚本(登录 / 注销)”。将以上两个脚本分别部署为登录和注销脚本,如

图 3 和 4 4)在 DC上的设置就完成了。回到客户端 ClientA ,执行一下命令 gpupdate /force

后注销再登录, 或者直接重启计算机让其生效。 同样,我们拿 Bob这个帐号来验

证。在 ClientA 上输入 Bob的用户名和密码后, 成功登录。如图 5 为 Bob登录后,

运行 set 命令得到的结果,从中我们可以看出,

Bob已登录到 ClientA 上。4) 同理,回到客户端 ClientB 上,执行一下命令 gpupdate /force 后注销再登

录,或者直接重启计算机让其生效。 我们仍然拿 Bob这个帐号来验证。在 ClientB

上输入 Bob的用户名和密码,如图 6,尽管能登录进去,但是很快就可以看到如

图 7 的信息,提示 Bob这个帐号已经在 ClientA 上登录。点击“确定”或者关闭

按钮后(或者直接等待 30 秒),系统就会自动注销,如图所示。5) 上面介绍的方法简单又实用, 只需要在服务端部署脚本即可, 不需要客户端

任何额外的设置。 能确保任何时刻都只有一个帐号在使用。

而且,提供的日记记

录信息也有不少用处,至少比在

DC上查看安全审核策略要来得更直观。以下我

简单介绍一下 log 中记录的信息 :

Logon一行记录的是某某用户于某某时间成功登录了哪台工作站;该处值为

Logoff 时则表示,某某用户于某某时间成功从哪台工作站注销了。

FailLogon 则记录的是登录失败的信息。 为什么会登录失败?是因为当前使用的

帐号已经在别处登录。

从图中第二行记录可以看出, Bob这个帐号试图在 ClientB 上登录,但是因为当

前已经在 ClientA 上登录(第一行 Logon 记录),所以就“ FailLogon ”啦。

需要说明的是, 除第一行外, 日志都会以时间的先后顺序将登录注销事件记录下

来,后发生的事件靠上。 但是第一行例外, 它记录的是当前某帐号目前在哪台工作站上,如果再次用这个帐号在别处登录, 那么登录脚本就首先会检查第一行记

录,如果记录的是 logon ,而且 at 后面的工作站不和当前工作站相同的话,就

会触发注销脚本,然后给出提示信息。如果第一行记录的是

logoff ,则表明该

帐号当前已经处于注销未登录状态,所以就不会再检测

at 后面的工作站名,直

接让该帐号可以再在别处登录。这也是整个登录脚本执行的原理。如上图所示,

第一行记录就表明, Bob这个帐号已经在 ClientA 上登录,且没有注销,不能在

别处登录。只能在 ClientA 上登录。

说到这,也许您会问我, 如果我用 Bob这个帐号在 ClientA 上登录后, 突然停电

了,根本就没有按正常的方式运行注销脚本, 那么该 Bob帐号还能在别处登录吗?

问题很好,我们来分析一下。突然停电,

Bob就肯定不会运行注销脚本,既然不

会运行注销脚本,那么就不会往

log 文件中的第一行添加 logoff 字段,根据前

面介绍的脚本执行原理可以得出结论,

Bob这个帐号肯定就不能在别处登录了。

因为脚本在检测的时候,会发现

log 文件里面依然记录的是 Bob还在 ClientA

上登录着呢。

如果我想再用 Bob在别处登录,那如何解决这个问题呢?

解决方法有两个:

  1. 将 bob.txt 日志文件中的第一行 logon 改为 logoff ,让脚本在检测的时候认

为 Bob已经注销,从未允许在别处登录

  1. 不修改 logon 值,直接修改 at 后面的工作站名。例如我将

ClientA 改为

ClientB ,则脚本会以为 Bob这个用户当前登录的是 ClientB ,从而允许“继续

在 ClientB 上登录”。

给TA买糖
共{{data.count}}人
人已赞赏
教程

HTTP状态码常见的网站错误代码大全

2020-9-24 18:01:49

教程

Laravel查询数据库中的随机记录

2020-9-25 17:53:32

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索