0

我想在遠程計算機上安排任務,我成功地安排遠程計算機上的任務不執行。就像我想在某個觸發時間下載文件一樣。 在我的任務調度程序它顯示任務已成功完成,但我沒有看到任何文件下載。調度任務與powershell

$ComputerName = "win12" 
$cr=Get-Credential $ComputerName\administrator  
$Session = New-PSSession -ComputerName $ComputerName -Credential $cr 

Invoke-Command -Session $Session -ScriptBlock {  
    $start = (Get-Date).AddMinutes(1).ToString("HH:mm:ss") 
    [string]$Result = schtasks /create /tn "kk" /tr "powershell.exe (New-Object System.Net.WebClient).DownloadFile('http://server12/vdir/OracleXE.exe','C:\abc.exe')" /sc once /st $start /ru "administrator" /rp "[email protected]" 
    $Result += schtasks /run /tn "kk" 

    $Result 

} 

即使觸發時間已過,或者我強制任務運行,文件不會下載。當我單獨運行命令時,它會下載文件,但不會與任務計劃程序一起使用。

+0

您可以驗證用戶上下文是否有權訪問遠程系統。 「管理員」聽起來像一個本地帳戶,而不是一個域帳戶。嘗試使用runas運行命令。 – JonC 2015-03-02 12:37:36

+0

什麼操作系統?沒有任務調度程序,腳本是否按預期運行?你可以嘗試將該任務作爲「NT AUTHORITY \ NETWORKSERVICE」運行嗎?你需要一個代理來訪問server12嗎? – 2015-03-02 12:39:24

+0

@JonC是的,那是該遠程機器的管理員......它可以執行任務。但任務總是處於就緒狀態......它不執行或顯示已成功執行但未執行。 – 2015-03-02 16:30:33

回答

0

問題是如何在powershell和schtasks中處理引號。由於/ tr命令需要用雙引號包圍,所以在命令內需要雙引號的地方使用單引號。這些又被轉換成雙引號。這與powershell.exe不兼容,因爲它反過來不能解釋命令中的雙引號。

我到目前爲止發現的唯一的解決方法是轉換的命令爲Base64,它保留了命令的確切的格式,並通過它使用-encodedCommand參數

$ComputerName = "win12" 
$cr=Get-Credential $ComputerName\administrator  
$Session = New-PSSession -ComputerName $ComputerName -Credential $cr 

$command = "(New-Object System.Net.WebClient).DownloadFile('http://server12/vdir/OracleXE.exe','C:\abc.exe')" 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 

Invoke-Command -Session $Session -ScriptBlock {  
    $start = (Get-Date).AddMinutes(1).ToString("HH:mm:ss") 
    [string]$Result = schtasks /create /tn "kk" /tr "powershell.exe -encodedCommand $encodedCommand" /sc once /st $start /ru "administrator" /rp "[email protected]" 
    $Result += schtasks /run /tn "kk" 

    $Result 
} 

更新到powershell.exe :
另一種可能不太複雜的方法,但要求使用PowerShell 3.0的計劃作業。

$ComputerName = "win12" 
$cr=Get-Credential $ComputerName\administrator  
$Session = New-PSSession -ComputerName $ComputerName -Credential $cr 

$command = {(New-Object System.Net.WebClient).DownloadFile(
    'http://server12/vdir/OracleXE.exe','C:\abc.exe')} 

Invoke-Command -Session $Session -ScriptBlock { 
    Register-ScheduledJob -Name kk -ScriptBlock $command; 
    (get-scheduledjob kk).Run() } 
} 
0

你似乎有問題kerberos雙跳代表團。我的建議:

  1. 創建一個PS1文件,並安排腳本文件
  2. 設置和使用的CredSSP爲authentocation在調用命令
  3. 可能是計​​劃的工作將是更適合這種情況下比計劃任務。