PowerShell 屏幕捕获

PowerShell Screen Capture

我在过去一天左右一直被困在这个问题上,我认为它是我看不到的小东西。

代码总结:Powershell 脚本每 60 秒运行一次以进行屏幕截图。在 Windows Server 2012 上,这工作得很好。在 Windows 7 上,只拍摄了第一个屏幕截图,之后的所有屏幕截图都是 "blank",尺寸大小只有白色 space。任何想法为什么会这样?

我还尝试删除较大的 while 循环并执行每 5 分钟运行一次的计划任务,但这同样不起作用,我得到的只是一个空白的白色图像。有什么想法吗?在 windows 7. 我正在使用本地管理员用户。

我在 windows 7 和 windows 服务器 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") 从 GAC 读取,未正确启动。不确定这是否有帮助。

很棒的脚本。

我为使其在 Windows 2012R2 和 Windows 7 Enterprise with SP 1 以及 运行 PowerShell 4 上工作所做的唯一修改是边界变量:

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

效果很好。

现在,只是想想想它的用途。

感谢您分享您的脚本。

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

简而言之,如果 运行 来自登录用户,这只能创建正确的屏幕截图。如果用户匹配,则计划任务符合条件。 运行 因为系统或本地管理员不允许您获取屏幕截图。