0

Я застрял на этом в течение последнего дня или около того, и я думаю, что это что-то маленькое, что я просто не вижу.PowerShell Screen Capture

Подводя итог коду: Скрипт Powershell, который будет запускаться каждые 60 секунд, чтобы сделать захват экрана. В Windows Server 2012 это работает отлично. В то время как в Windows 7 выполняется только первый снимок экрана, а затем все после этого «пустые» с просто белым размером с размерами. Любые идеи, почему это происходит?

Я также попытался удалить большую петлю while и выполнить запланированную задачу, которая запускается каждые 5 минут, но снова это не работает, и все, что я получаю, - это пустое белое изображение. Есть предположения? В Windows 7. Я использую локального пользователя Admin.

Я использую PowerShell 4 на обоих окнах 7 и Windows Server 2012 и .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 

}

Edit: я понял, что эту линию: [Reflection.Assembly]: : LoadWithPartialName («System.Drawing») , который считывает из GAC, не запускается правильно. Не уверен, что это поможет.

+0

Возможно, ваши проблемы возникли из-за неправильной работы сборки 'System.Drawing'. Попробуйте установить установку .NET. – Vesper

ответ

0

Прохладный сценарий.

Единственное изменение, которое я сделал, чтобы получить его работу работать, как на Windows, 2012R2 и Windows 7 Enterprise с пакетом обновления 1, а также как работает PowerShell 4, это границы переменной:

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

Работает отлично.

Теперь, просто пытаясь придумать для этого цель.

Спасибо, что поделились своим скриптом.

+0

Он работает удивительно хорошо, если вы запустите его в консоли PowerShell или автономном скрипте. Он не работает, когда я помещаю его в большой цикл или в расписание задач. –

0

Когда задача запускается из альтернативного контекста, чем вошедший в систему пользователь (любой пользователь, если система является терминалом), у него нет доступа к рабочему столу, поэтому вы получаете пустые скриншоты. Скрипт работает, за исключением того, что я переместил весь код, который загружает, задает и объявляет функцию из цикла, и сумел запустить ее как запланированную задачу с правильно сформированными снимками экрана. Такое поведение по умолчанию и является проблемой безопасности, поскольку другие пользователи не должны иметь доступ к рабочему столу текущего пользователя, включая локальную систему. Вы можете разместить такую ​​задачу в диспетчере задач для работы под определенным пользователем, но вам будет предложено ввести пароль этого пользователя для хранения задачи в Планировщике заданий. После того, как вы создадите задачу, вы сможете установить ее расписание и настроить ее на запуск только при входе пользователя в систему (интерактивная задача). Если это так, скройте окно Powershell, используя -WindowStyle hidden в параметрах powershell.exe.

Вкратце, это может создавать только правильные скриншоты, если они запускаются из-под входа в систему. Запланированные задачи могут быть сопоставлены с пользователями. Запуск системы или локального администратора не позволит вам получить скриншоты.