这里需要记住服务器、数据库和表的名称,在脚本中需要用到。
2。由于脚本是用户登录/注销脚本,因此是用当前登录用户的账户权限运行的,如果SQL Server采用“仅Windows身份认证”需要该账户能够访问SQL Server并在上述表中添加或删除记录,因此需要将SQL Server的安全模式改为混合模式,并且创建一个SQL登录标识并设定密码。
当然可以在数据库中进行权限设置,使该账户仅仅能够访问上述表,而不是整个数据库。这一点在SQL Server安全中尤其重要!
记住SQL Server中创建的这个登录标识和密码。在脚本中也需要使用到。
'**************下面是登录脚本**************************************
'限制域中同账户重复登录:用户登录脚本
'基本原理是在用户登录过程中,检查数据库(事先创建)中当前登录账户和计算机信息,
'如果没有当前登录的用户和计算机信息,则允许登录;如果已经存在当前登录的账户,则不予登录
'当用户注销或关机,则运行注销脚本,将登录时记录的信息从数据库中删除
'本脚本是登录脚本
'作者:许震 v-zhenxu@microsoft.com
'2008-3-11
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3
Const E_Recordset_Not_Found=&h800A0BCD
Set bj = WScript.CreateObject("WScript.Shell")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set bjConnection = CreateObject("ADODB.Connection")
Set bjRecordSet = CreateObject("ADODB.Recordset")
'获得当前登录的用户账户和计算机名
CurrentUserName=WshNetwork.UserName
CurrentPcName=WshNetwork.ComputerName
'连接到SQL Server并打开相应的数据库
'Data Source=win2k3指定SQL Server服务器名
'Trusted_Connection=no表示使用SQL身份认证连接,这是必须的
'Initial Catalog=Northwind指定数据库
'User ID=limiteduser;Password=pass01!指定数据库连接账户和密码
objConnection.Open _
"Provider=SQLOLEDB;Data Source=win2k3;" & _
"Trusted_Connection=no;Initial Catalog=Northwind;" & _
"User ID=limiteduser;Password=pass01!;"
objRecordset.CursorLocation = adUseClient
'获得adlogin表中的所有记录,注意根据实际情况使用表名
objRecordSet.Open "SELECT * FROM adlogin", _
objConnection, adOpenStatic, adLockOptimistic
IF err.number = E_Recordset_Not_Found Then
Wscript.Echo "no table!"
script.Quit 1
End If
'在结果集中查询currentloginuser字段包含当前登录账户的记录
strSearchCriteria = "currentloginuser = '" & CurrentUserName & "'"
objRecordSet.Find strSearchCriteria
'如果结果集中没有当前用户记录,说明该账户目前没有人使用,
'允许用户登录并在数据库中记录当前用户、计算机和登录时间
If objRecordset.EOF Then
objRecordSet.AddNew
objRecordSet("currentloginuser") = UCase(CurrentUserName)
objRecordSet("currentloginpc") = UCase(CurrentPcName)
objRecordSet("logintime") = now()
objRecordSet.Update
'如果结果集中有当前登录用户记录,说明该账户已经有人在使用,分两种情况处理
Else
'再检查当前登录计算机名称,如果和数据库中的计算机记录不一致,说明是使用同一个账户在不同计算机上登录,
'显示提示信息,并强制用户注销
If UCase(objRecordset.Fields.Item("currentloginpc")) <> UCase(CurrentPcName) Then
'在这里存在一个风险,当弹出警告信息框时,如果用户不管这个提示,而是直接调用任务管理器杀掉脚本宿主进程,
'则可以绕过登录限制,因此为了杜绝这个漏洞,可以将下面3行显示警告框的部分删除。
'这样可以不给客户调用任务管理器的机会,除非客户是闪电侠
WScript.Echo "The user account " & objRecordset.Fields.Item("currentloginuser") & " has login on " & _
objRecordset.Fields.Item("currentloginpc") & _
", so you can't login using the same user account. Please call the administrator!"
obj.Run "logoff"
'如果当前登录计算机名称和数据库中一致,说明是同一个账户在同一台计算机上登录,允许登录并更新数据库登录时间
'这主要是为了防止计算机非正常关机导致在数据库中的信息没有正常删除,造成用户不能登录
'因此如果客户机非正常关机,或网络原因,只要下次登录仍然在同一台计算机,仍旧可以登录,只是登录时间更新
Else
objRecordSet("logintime") = now()
objRecordSet.Update
End If
End If
objRecordSet.Close
objConnection.Close
'********************下面是注销脚本**********************************
'限制域中同账户重复登录:用户注销脚本
'基本原理是在用户登录过程中,检查数据库(事先创建)中当前登录账户和计算机信息,
'如果没有当前登录的用户和计算机信息,则允许登录;如果已经存在当前登录的账户,则不予登录
'当用户注销或关机,则运行注销脚本,将登录时记录的信息从数据库中删除
'本脚本是注销脚本
'作者:许震 v-zhenxu@microsoft.com
'2008-3-11
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3
Const E_Recordset_Not_Found=&h800A0BCD
Set bjConnection = CreateObject("ADODB.Connection")
Set bjRecordSet = CreateObject("ADODB.Recordset")
Set WshNetwork = WScript.CreateObject("WScript.Network")
'获得当前登录的用户账户和计算机名
CurrentUserName=WshNetwork.UserName
CurrentPcName=WshNetwork.ComputerName
'连接到SQL Server并打开相应的数据库
'Data Source=win2k3指定SQL Server服务器名
'Trusted_Connection=no表示使用SQL身份认证连接,这是必须的
'Initial Catalog=Northwind指定数据库
'User ID=limiteduser;Password=pass01!指定数据库连接账户和密码
objConnection.Open _
"Provider=SQLOLEDB;Data Source=win2k3;" & _
"Trusted_Connection=No;Initial Catalog=Northwind;" & _
"User ID=limiteduser;Password=pass01!;"
objRecordset.CursorLocation = adUseClient
objRecordSet.Open "SELECT * FROM adlogin", _
objConnection, adOpenStatic, adLockOptimistic
IF err.number = E_Recordset_Not_Found Then
Wscript.Echo "no table!"
script.Quit 1
End If
'在结果集中查询currentloginuser字段包含当前登录账户的记录
strSearchCriteria = "currentloginuser = '" & CurrentUserName & "'"
objRecordSet.Find strSearchCriteria
'删除该用户的登录记录
If UCase(objRecordset.Fields.Item("currentloginpc")) = UCase(CurrentPcName) Then
objRecordset.Delete
End If
objRecordSet.Close
objConnection.Close
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23034/viewspace-246588/ ,如需转载,请注明出处,否则将追究法律责任。