首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

操作系统

Windows 9X | Linux&Uinx | Windows Server | 其它操作系统 | Vista | FreeBSD | Windows 7 |
首页 > 操作系统 > Windows Server > 限制域中账户在不同计算机上重复登录的脚本 > 正文

限制域中账户在不同计算机上重复登录的脚本

出处:http://www.cnblogs.com/xz1215 作者:xz1215 时间:2009-7-1 17:05:20

    在微软的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

相关文章 热门文章
  • 继gmail之后谷歌购买并新注多个邮件域
  • Lync Server 2010部署攻略之域管理员启用
  • TurboMail如何搭建与外网通信的局域网邮件服务器
  • 恢复安装在Windows 2008域控制器上的Exchange 2010
  • Windows 2003域更名工具(Domain Rename Tool)
  • Exchange 2007 中“接受域”,"权威域",还有“中继域"的区别
  • 重命名域控制器和Exchange服务器
  • 使用Windows Server 2003的Netsh命令创建DHCP作用域
  • 创建DHCP作用域
  • 263G+多域管理功能创新 揭示企业邮箱新思路
  • Windows Xp/Windows 7自动加域及用户资料自动迁移
  • 如何在域环境使用脚本批量更改本地管理员密码
  • “http 500内部服务器错误”的解决方法
  • 利用Windows 2000 Server的RRAS实现VPN服务器
  • 用凤凰万能启动盘解决本地/域管理员密码丢失
  • Win2003 Server企业版安装配置
  • Active directory 灾难恢复
  • Windows 2000/03域和活动目录
  • 如何在vmware4上创建windows 2003群集
  • MSI文件制作全过程
  • Win2000命令全集(一)
  • Windows 2000/AD技巧
  • 此系统的本地策略不允许您采用交互式登录解决方法
  • Win2000路由的安装与设置实现不同网段互通
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号