在微软的AD域中,任何一个用户账户都可以在不同的客户机上登录,有时甚至同一个账户同一个时间在不同的计算机上重复登录。微软AD自带的账户控制功能“登录到”设置仅仅能控制某一个账户在某一台(或多台)计算机上登录,但是并不能控制整个域中所有账户的重复登录。

在微软的AD域中,任何一个用户账户都能够在不同的客户机上登录,有时乃至同一个账户同一个时刻在不同的核算机上重复登录。微软AD自带的账户操控功用“登录到”设置仅仅能操控某一个账户在某一台(或多台)核算机上登录,可是并不能操控整个域中避实就虚账户的重复登录。

约束域中账户在不同核算机上重复登录的脚本  限制域中账户 计算机 脚本 重复登录 第1张

除非管理员能够十分有耐性的设置每一个账户的登录方位,而且从此以后这些账户的登录核算机被固定死了。那么怎么到达约束账户同一时刻只能登录一台核算机,而且登录方位不约束呢?
微软有一个软件叫LimitLogon,可是需求至少一台服务器作为 Web Server,需求扩展架构,创立一个应用程序分区(会影响康复速度)。客户端需求Dotnet 1.1和装置一个客户端软件以支撑SAOP和Web Server通讯。这些条件一般公司很难承受。还有一个第三方软件叫UserLock,很好很强壮,可是收费的。
现在用脚原本完成这个功用,基本思想是这样的:
1。当用户登录时,查看数据库中避实就虚当时用户登录记载,假如没有该账户信息,答应登录,并记载登录账户、客户机方位和时刻;
2。当另一个用户运用相同的账户登录时,进行相同的查看,因为现已有登录的信息记载,阐明现在登录的账户是重复登录,则制止登录;
3。当用户刊出或关机时,运转刊出脚本,将数据库中的登录信息进行删去以备下一次登录;
4。假如因为网络原因或客户机反常关机,导致刊出或关机时用户登录信息没有正常删去,影响下一次登录,因而在登录查看时,假如当时登录的账户和客户机与数据库中的信息是共同的,阐明是同一个账户在同一个核算机上登录,依然答应登录,仅仅是更新数据库中的登录时刻信息。
本来完成办法是运用一个文本文件作为登录信息的记载,可是发现当登录用户较多时,因为文本的单用户操作性,多个用户不能一起进行登录信息的记载,形成登录推迟,因而改用SQL Server(也可所以MSDE)进行登录信息的记载。假如运用Access数据库,因为Access依然是单用户的,能够在前端运用一个Web承受用户登录信息(类似于某些网站)。可是进行Web的开发还不如运用MSDE简略,管中窥豹就不做解说了。
阐明:
1。首先要找一个SQL Server服务器,创立一个数据库(或运用现有数据库),在里面创立一个表adlogin,表结构如下:
create table adlogin
(currentloginuser varchar(20),
currentloginpc varchar(20),
logintime datetime)
管中窥豹需求记住服务器、数据库和表的称号,在脚本中需求用到。
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 obj = WScript.CreateObject("WScript.Shell")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = 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

#P#

'********************下面是刊出脚本**********************************

'约束域中同账户重复登录:用户刊出脚本
'基本原理是在用户登录过程中,查看数据库(事前创立)中当时登录账户和核算机信息,
'假如没有当时登录的用户和核算机信息,则答应登录;假如现已存在当时登录的账户,则不予登录
'当用户刊出或关机,则运转刊出脚本,将登录时记载的信息从数据库中删去
'本脚本是刊出脚本
'作者:许震 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 objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = 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

【修改引荐】

  1. Windows 7 UAC缝隙之技能内情
  2. Windows 7内置定位服务引发安全疑虑
  3. Windows 7操作系统新技能深入探讨(1)
转载请说明出处
知优网 » 约束域中账户在不同核算机上重复登录的脚本

发表评论

您需要后才能发表评论