我在Job中有一个函数,它带有一个截图。脚本本身由Taskscheduler作为域管理员执行。我还检查了#34;以最高权限运行"。
作业应该做一个截图,然后发送一封电子邮件,但这两件事都不会发生。我也没有看到错误信息(也许是因为它是后台工作?)。也许电子邮件没有被发送,因为它想要将屏幕截图附加到电子邮件,但不能因为截图没有创建。
为什么我的功能没有截屏?域管理员具有写入目标的权限。当我在start-job
之外运行该功能时,会创建屏幕截图。如果我有start-job
内的功能它没有被创建,如果脚本是通过Taskscheduler启动或手动启动并不重要。
我错过了什么?
以下代码启动作业并截取屏幕截图:
Start-Job -Name LogikWebserverWatch {
function Take-Screenshot([string]$outfile)
{
[int]$PrtScrnWidth = (gwmi Win32_VideoController).CurrentHorizontalResolution
[int]$PrtScrnHeight = (gwmi Win32_VideoController).CurrentVerticalResolution
$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, $PrtScrnWidth, $PrtScrnHeight)
$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($outfile)
$graphics.Dispose()
$bmp.Dispose()
}
while ((Get-Process LogikWebserver).Responding) {sleep -Milliseconds 50}
if (!(Get-Process LogikWebserver).Responding) {
Try{
$utf8 = New-Object System.Text.utf8encoding
$datetime = (get-date).ToString('yyyyMMdd-HHmmss')
Take-Screenshot -outfile C:\Install\LogikWebserverErrorReporting\Screenshot-$datetime.png
# some more code [...]
} Catch { some more code [...] }
}}
答案 0 :(得分:1)
Windows PowerShell后台作业运行命令而不与当前会话交互。
因此,您可能必须在工作中加载所需的程序集才能运行。
当我尝试上面的代码时,它只在作业外运行时创建了一个屏幕截图(如您所述),但是将此行添加到Start-Job
ScriptBlock
的顶部会导致其工作从工作中也是如此:
[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
或者,由于以上情况现已被删除:
[System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll")
或者
Add-Type "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll"
请注意,在从计划任务运行时,我没有对此进行过测试。
答案 1 :(得分:0)
不要使用功能。只需在脚本块中编写功能代码,如下所示:
Start-Job -Name LogikWebserverWatch {
Add-Type -AssemblyName "System.Drawing"
[int]$PrtScrnWidth = (gwmi Win32_VideoController).CurrentHorizontalResolution
[int]$PrtScrnHeight = (gwmi Win32_VideoController).CurrentVerticalResolution
$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, $PrtScrnWidth, $PrtScrnHeight)
$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($outfile)
$graphics.Dispose()
$bmp.Dispose()
}
while ((Get-Process LogikWebserver).Responding) {sleep -Milliseconds 50}
if (!(Get-Process LogikWebserver).Responding) {
Try{
$utf8 = New-Object System.Text.utf8encoding
$datetime = (get-date).ToString('yyyyMMdd-HHmmss')
Take-Screenshot -outfile C:\Install\LogikWebserverErrorReporting\Screenshot-$datetime.png
# some more code [...]
} Catch { some more code [...] }
}