PowerShell限制计算机使用时长
前两天中午吃饭的时候,同事问在Windows下有没有什么办法可以限制用户使用计算机的时长,比如超过两个小时,则不允许继续使用,另一同事说网上有很多类似的软件啊,超时了则不允许其继续上网,同事说是想限制其不能再继续使用计算机。我问是不是想限制你儿子玩游戏啊,他说是。我想了想说这个不难,我给你写个脚本吧,过两天给你。
大概思路就是根据开机时间判断其使用时长,超时后则自动注销,但也不能一概而论,必须要区分对待不同的账户,否则的话,电脑就谁都没法用了。所以最好就是再新建一个账户,根据其登陆时间判断使用时长,超时后自动注销,为了防止其再重新登录,可以将其账户禁用,管理员可以重新启用。
总体思路如下:
1. 使用 Query User命令获取当前登陆账户及其登陆时间
2. 判断当前用户名,使用时长是否超过2小时
如果是administrator,则不做任何处理;
如果不是administrator,并且登陆时间大于2小时,则将其禁用,然后自动注销,为了人性化需要,先弹出一个窗口提示用户在1分钟后系统将自动注销
3. 通过计划任务每隔15分钟或半小时运行一次该脚本
详细脚本命令如下:
$QUser = Query User
For ($i=1;$i -le $Quser.Count-1; $i++) { #取当前用户名称 $user = $QUser[$i].Split(" ")[0].Split(">")[1] #取当前用户的登陆时间 $time = [DateTime]($QUser[$i].Split("-")[2].Split(" ")[1])
#判断当前用户非administrator,并且登陆时间大于2小时,则将其禁用,需要使用administrator登陆后启用 IF ( ($user -ne "administrator") -and (((Get-Date)-$time).Totalhours -gt 0.1 ) ) { #弹出窗口提示用户将注销,弹出窗口5秒钟后将自动关闭 $vbs = New-Object -ComObject WScript.Shell $vbs.popup("一分钟之后将注销,请保存当前数据",5,"提示") #延时60秒 Start-Sleep -Seconds 60 #禁用当前用户 $userc =gwmi win32_useraccount|where {$_.name -eq $user} $userc.Disabled = $true $userc.put() #注销 shutdown -l } } |
在此简单解释一下,Query User命令本身属于批处理命令,运行后显示信息如下:
在Windows XP系统中,不能同时有多个用户本地登录,在Windows Server2003或2008中,则允许多个用户同时登录,所以在此处使用了For循环进行遍历。
Query User的查询结果均为字符类型,所以使用了Split方法截取字符,从而取出当前用户名;登录时间也是一样,只是最后通过datatime将其转换为时间类型,用来和当前时间进行比较。
PowerShell脚本在运行的时候,会出现一个黑色窗口,有时可能会一闪而过,为了使其在后台运行,可以通过vbs脚本调用PowerShell,达到隐藏窗口的目的,vbs脚本命令如下:
Set ws = CreateObject("Wscript.Shell") ‘PowerShell脚本名为Auto_Logoff.ps1,存放在C盘根目录下,可以自行更改 ws.run "cmd /c C:\Auto_Logoff.ps1",vbhide |
还有一点需要注意的是:Windows XP默认不支持Query User命令,可以在Windows 7或Windows Server系统下将C:\Windows\System32下的query.exe文件拷贝到XP的同样目录下。