限制域用户多点登录--脚本

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
在51上看到一篇不错的博文,转载下备以后工作中使用。有机会做一个实验,一并上传博文。
文章出自: http://chongerfei.blog.51cto.com        
   
        在微软的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

本文转自 yab109 51CTO博客,原文链接:http://blog.51cto.com/active/536002,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
开发工具
练习客户机地址控制 基于用户验证访问网站
练习客户机地址控制 基于用户验证访问网站
|
2月前
|
网络协议 Shell
Ansible 学习笔记 - 定位主机和组的模式
Ansible 学习笔记 - 定位主机和组的模式
|
数据安全/隐私保护 Windows 容器
域策略+脚本实现客户端administrator帐号密码统一
用域策略+脚本实现把客户端administrator帐号密码统一更改     在写这贴之前,我在网上找过很多关于这个方面的资料,看到他们都是说的差不多,但是当一个新手来弄的话就比较难实现了。
979 0

热门文章

最新文章