2016-11-02 56 views
2

我有一個功能內的作業,它需要一個屏幕截圖。腳本本身由Taskscheduler作爲域管理員執行。我還檢查了「以最高權限運行」。爲什麼我的屏幕截圖功能不能作爲工作

工作應該做一個截圖,然後發送電子郵件,但這兩件事情都不會發生。我也沒有看到錯誤信息(可能是因爲它是後臺工作?)。也許電子郵件不會被髮送,因爲它要將截圖附加到電子郵件上,但不能因爲屏幕截圖未被創建。

爲什麼我的功能沒有截圖?域管理員有權寫入目標。當我運行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

當我運行函數的前兩行時,出現'System.Object [ ]「來鍵入」System.Int32「。 - 你沒有明白嗎? – Bassie

+1

@Bassie nope。我已經在其他腳本中多次使用過該函數。如何在「CurrentHorizo​​ntalResolution」中有兩個或更多值?你有兩張圖形卡嗎? – SimonS

+0

你確定'腳本本身是由Taskscheduler作爲域管理員來執行嗎?這是很多特權。 – vonPryz

回答

1

The documentations說:

Windows PowerShell後臺作業運行一個命令而不與當前會話交互。

所以你可能不得不在你的工作中加載所需的程序集,然後才能工作。

當我想你的代碼上述內容,當作業外部運行僅創建了一個屏幕截圖(如你所提到的),但加入這行來Start-JobScriptBlock的頂部導致它從工作中以及工作:

[Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

或者,正如上面現在depracated:

[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" 

請注意,從調度任務運行時我沒有測試過。

+0

omg。我不能相信我錯過了這一點。非常感謝你! – SimonS

+1

@SimonS沒問題,很高興我可以幫忙,順便說一句 - 我有2張顯卡! – Bassie

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 [...] } 
} 
+0

不能按預期工作! – SimonS

+0

@SimonS好的。所以刪除帖子? – saftargholi