Показать полную графическую версию : создание скриншота и его моментальная отправка на почтовый ящик
v79italya, я даже уже и не знаю…
Давайте попробуем заменить в начале:
[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null
на:
Add-Type -AssemblyName 'System.Drawing'
Add-Type -AssemblyName 'System.Windows.Forms'
А так-то идей нет.
v79italya
08-10-2019, 18:20
Iska, Вы не парьтесь много. Помощь - дело добровольное. Если в итоге ничего не получится - я не расстроюсь.
Можно попробовать по другому: скриншоты я как нибудь сделаю сторонними программами. А возможно отправлять на почту вложение из папки? то вложение, у которого дата создания или дата изменения были позже всех.
v79italya
08-10-2019, 18:42
Iska, во первых, спасибо за код и за то что нашли причину.
смотрите. попробовал с этими строками: Add-Type -AssemblyName 'System.Drawing'
Add-Type -AssemblyName 'System.Windows.Forms' все отработало правильно. Потом попробовал с этими строками:[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null тоже все отработало правильно. только в коде из сообщения 13 только одна строка[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null . Наверное поэтому и не работало.
Только сейчас тоже есть проблема. Возможно ли запускать скрипт в фоне или в трее? Иначе черное окошко PShell(как cmd) виднеется на скриншоте.
В общем — не знаю. У меня работает и с [Reflection.Assembly]::LoadWithPartialName() и с Add-Type. Почему у Вас местами не работало с одним из них — нужно ждать мнения коллег-специалистов, коим я не являюсь.
Возможно ли запускать скрипт в фоне или в трее? »
В трее вообще ничего нельзя «запустить». В принципе.
Создайте задание в Планировщике заданий. На вкладке «Действия» создайте действие «Запуск программы». В группе «Параметры» в поле «Программа или сценарий» укажите:
"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe"
В поле «Добавить аргументы (необязательно)» укажите:
-NoLogo -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File "C:\Мои проекты\0279\0001.ps1"
где вместо выделенного укажите путь к Вашему файлу.
Настройте расписание на вкладке триггеры — начало выполнения задания, повтор и продолжительность.
Окно консоли PowerShell всё равно будет появляться (потому что, как я понял, сначала создаётся окно консоли, а затем уже, в процессе выполнения, к нему применяется сокрытие), но на скриншотах его не будет (если всё равно будет — попробуйте немного увеличить паузу в:
Start-Sleep -Milliseconds 250
). Если Вам надо радикально — чтобы вообще даже не светилось окно в принципе, то можно будет ещё поиграться.
v79italya
08-10-2019, 19:29
Iska, ok. Сделаю как советуете. Спасибо Вам большое!
v79italya
08-10-2019, 20:57
Почему у Вас местами не работало с одним из них » не работал в таком виде:[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
Start-Sleep -Milliseconds 250
$oRectangle = ([System.Windows.Forms.Screen]::AllScreens)[0].Bounds
$oBitmap = [System.Drawing.Bitmap]::new($oRectangle.Width, $oRectangle.Height)
$oGraphics = [System.Drawing.Graphics]::FromImage($oBitmap)
если же первую строку заменить на две строки любого из двух предложенных Вами вариантов:[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null
Add-Type -AssemblyName 'System.Drawing'
Add-Type -AssemblyName 'System.Windows.Forms'
то все работает. Может, причина не в этом
сли же первую строку заменить на две строки любого из двух предложенных Вами вариантов … то все работает. »
А… То бишь, Вы изначально просто не дочитали всю тему до конца. Ясно, разобрались.
v79italya
08-10-2019, 21:17
изначально просто не дочитали всю тему до конца » моя вина) Не вчитался в сообщение #23. Прошу извинить за то что помучил
nircmd.exe savescreenshot "scr~$currdate.MM_dd_yyyy$-~$currtime.HH_mm_ss$.png" »
А не подскажете, как в команде скрину увеличить размер, чтоб качество и чёткость лучше было?
прочёл выше сказанное и создал screen.ps1
[Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null
Add-Type -AssemblyName 'System.Drawing'
Add-Type -AssemblyName 'System.Windows.Forms'
$oGraphics.CopyFromScreen($oRectangle.Location, [System.Drawing.Point]::Empty, $oRectangle.Size)
$oMemoryStream = [System.IO.MemoryStream]::new()
$oBitmap.Save($oMemoryStream, [System.Drawing.Imaging.ImageFormat]::Png)
$oBitmap.Save('C:\abcabc\0001.png')
$oMemoryStream.Seek(0, [System.IO.SeekOrigin]::Begin) | Out-Null
$oMailMessage = New-Object -TypeName 'Net.Mail.MailMessage'
$oMailMessage.From = 'from@mail.com'
$oMailMessage.To.Add('to@mail.com')
$oMailMessage.SubjectEncoding = [System.Text.Encoding]::Unicode
$oMailMessage.Subject = "Screenshot at $(Get-Date)"
$oMailMessage.IsBodyHTML = $true
$oMailMessage.BodyEncoding = [System.Text.Encoding]::Unicode
$oMailMessage.Body = "<h2>Hello World!</h2></br>Screenshot at $(Get-Date) here."
$oContentType = New-Object -TypeName 'Net.Mime.ContentType' -Property @{
MediaType = "image/png"
Name = "Screenshot at $(Get-Date).png"
}
$oAttachment = New-Object -TypeName 'Net.Mail.Attachment' -ArgumentList $oMemoryStream, $oContentType
$oMailMessage.Attachments.Add($oAttachment)
$oSmtpClient = New-Object -TypeName 'Net.Mail.SmtpClient' -ArgumentList 'mail.mail.com', 465 #465
$oSmtpClient.EnableSsl = $true
$oSmtpClient.Credentials = New-Object -TypeName 'System.Net.NetworkCredential' -ArgumentList 'from@mail.com', '123456'
$oSmtpClient.Send($oMailMessage)
Когда запускаю нифига не происходить. как будто и ничего не запускал. Windows 11
DJ Mogarych
12-05-2023, 17:25
Когда запускаю нифига не происходить »
Оно и к лучшему.
$t = get-date
$scr = "$env:temp\$($t.ToString("yyyy-MM-dd-HH-mm-ss"))-screenshot.png"
[void][reflection.assembly]::loadwithpartialname("system.windows.forms")
[system.windows.forms.sendkeys]::sendwait('{PRTSC}')
Get-Clipboard -Format Image | ForEach-Object -MemberName Save -ArgumentList $scr
Send-MailMessage -SmtpServer mail.example.com `
-From 'vasya@example.com' `
-To 'kolya@example.com' `
-Attachments $scr `
-Subject "Screenshot from Vasya $($t.ToString())"
Send-MailMessage настраивайте по ситуации.
dmitryst
12-05-2023, 18:08
Send-MailMessage настраивайте по ситуации. »
у вас в примере open-relay без авторизации, а с авторизацией как?
Используя
$cred = Get-Credential
Send-MailMessage ... -Credential $cred,
появляется окно стандартного запроса юзер/пароль, а как скормить эту пару из файла, например, или прямым текстом?
DJ Mogarych
12-05-2023, 18:12
На эту тему написаны километры текста (https://www.google.com/search?q=Send-MailMessage+credentials).
dmitryst
12-05-2023, 18:59
DJ Mogarych, собственно, да
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
чё-то я тупанул :(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.