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 Server20032008中,则允许多个用户同时登录,所以在此处使用了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 7Windows Server系统下将C:\Windows\System32下的query.exe文件拷贝到XP的同样目录下。

posted on 2013-01-22 09:03  momingliu11  阅读(1048)  评论(0编辑  收藏  举报