限制域中帐户在不一样计算机上重复登陆的脚本

在微软的AD域中,任何一个用户帐户均可以在不一样的客户机上登陆,有时甚至同一个帐户同一个时间在不一样的计算机上重复登陆。微软AD自带的帐户控制功能“登陆到”设置仅仅能控制某一个帐户在某一台(或多台)计算机上登陆,可是并不能控制整个域中全部帐户的重复登陆。
    除非管理员可以很是有耐心的设置每个帐户的登陆位置,而且今后之后这些帐户的登陆计算机被固定死了。那么如何达到限制帐户同一时间只能登陆一台计算机,而且登陆位置不限制呢?
    微软有一个软件叫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

    '********************下面是注销脚本**********************************

    '限制域中同帐户重复登陆:用户注销脚本
    '基本原理是在用户登陆过程当中,检查数据库(事先建立)中当前登陆帐户和计算机信息,
    '若是没有当前登陆的用户和计算机信息,则容许登陆;若是已经存在当前登陆的帐户,则不予登陆
    '当用户注销或关机,则运行注销脚本,将登陆时记录的信息从数据库中删除
    '本脚本是注销脚本
    '做者:许震 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
相关文章
相关标签/搜索