PowerShell屏幕截图

时间:2015-01-04 20:27:45

标签: screenshot windows-7-x64 screen-capture windows-server-2012-r2 powershell-v4.0

我在最后一天左右一直坚持这一点,我认为它的东西很小,我无法看到。

总结代码:Powershell脚本,每60秒运行一次以进行屏幕截图。在Windows Server 2012上,这非常好用。在Windows 7上,只拍摄第一个屏幕截图,然后所有屏幕截图都显示为空白"只有白色空间尺寸的大小。任何想法为什么会这样?

我还尝试删除较大的while循环并执行每5分钟运行一次的计划任务,但是再次没有工作,我得到的只是一张空白图像。有什么想法吗?在Windows 7上。我正在使用本地管理员用户。

我在Windows 7和Windows Server 2012上都使用了PowerShell 4。而.Net 4.5

while($true){   
[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
function screenshot([Drawing.Rectangle]$bounds, $path) {
   $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
   $graphics = [Drawing.Graphics]::FromImage($bmp)

   $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)

   $bmp.Save($path)

   $graphics.Dispose()
   $bmp.Dispose()
}

#NUC bounds
$bounds = [Drawing.Rectangle]::FromLTRB(0, -1080, 1920, 1080)

#remote display bounds
#$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1280, 800)

$PC_name=$(Get-WmiObject Win32_Computersystem).name

$dateandtime = Get-Date -Format yyyy-MM-dd-hh-mm-ss

$path_pcname= "C:\Scripts\Screenshots\" + $PC_name + "_screenshot_" + "$dateandtime"+ ".png"


screenshot $bounds $path_pcname

$limit = (Get-Date).AddMinutes(-15)
$path_todelete = "C:\Scripts\Screenshots\"

# Delete files older than the $limit.
Get-ChildItem -Path $path_todelete -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

Start-Sleep -Seconds 60

}

编辑: 我意识到这一行:     [Reflection.Assembly] :: LoadWithPartialName(" System.Drawing中&#34) 从GAC读取的内容未正确启动。不确定这是否有帮助。

2 个答案:

答案 0 :(得分:1)

当任务从备用上下文运行而不是登录用户(任何用户,如果系统是终端)时,它无权访问桌面,这就是为什么你得到空屏幕截图。该脚本有效,除了我已经移动了所有从循环中加载,预设和声明函数的代码,并设法将其作为具有正确形成的屏幕截图的计划任务运行。默认情况下,此行为是一个安全问题,因为其他用户不应该访问当前用户的桌面,包括本地系统。您可以在任务管理器中放置此类任务以在特定用户下运行,但系统会提示您输入该用户的密码以将任务存储在任务计划程序中。创建任务后,您将能够设置其计划并将其设置为仅在用户登录时运行(交互式任务)。如果是这样,请在-WindowStyle hidden参数中使用powershell.exe隐藏Powershell窗口。

简而言之,如果从登录用户下运行,则只能创建正确的屏幕截图。如果用户匹配,计划任务就有资格。以系统或本地管理员身份运行不会让您获得屏幕截图。

答案 1 :(得分:0)

酷剧本。

我在Windows 2012R2和Windows 7企业版上使用SP 1以及同时运行PowerShell 4的唯一修改是使其工作,是边界变量:

$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1600, 900) # My resolution.

效果很好。

现在,只是试着想出它的目的。

感谢您分享您的剧本。