Bar

PowerShell タスク スケジューラのタスクをリモートから実行する方法

新年おめでとうございます。
本年も「元「なんでもエンジニ屋」のダメ日記」を何卒宜しくお願い致します。

さて、新年一つ目の記事です。
Windows Server のタスク スケジューラに登録しているタスクをリモートから実行したい事がたまにありませんか?
都度リモート デスクトップ接続し手動でタスクを実行・・・面倒です。
今回は、PowerShellを使ってタスク スケジューラのタスクをリモートから実行する方法をメモ。
2014.01.01 各サンプルに「セッションを破棄」を追記しました

前提条件

  1. ローカル及びリモートでEnable-PSRemoting コマンドレットを実行済みである事
    1. WinRMサービスが起動している
    2. Firewallのルールを追加している
  2. リモートからの要求を許可するリスナ設定済みである事

タスク スケジューラのタスクをリモートから実行する

調査した限り、リモート環境によって実行するPowerShell コマンドレットが異なりました
Windows 7/Windows Server 2008 R2以下の場合
XXX-ScheduledTask コマンドレットはWindows8/Windows Server 2012以上+Windows PowerShell 4.0の環境でしか使えません。
※Windows 7 SP1にWMF4.0をインストールしましたが該当するコマンドレットはありませんでした。
この環境では、PSセッションを新規作成し、Invoke-Command コマンドレットを使ってタスクを実行します。
リモートのタスクを実行するには、schtasks.exe を使います。
#セッションを新規作成
$s = New-PSSession -ComputerName <サーバー名> -Credential <ドメイン名\ユーザー名>
#実行したいタスク名を確認
Invoke-Command -Session $s -ScriptBlock{schtasks.exe /query}
#タスク実行
Invoke-Command -Session $s -ScriptBlock{schtasks.exe /run /tn "<タスク名>"} -AsJob
#タスクの実行状態を確認
Get-Job -Id X
#ジョブを削除
Remove-Job -Id X
#セッションを破棄
Remove-PSSession -Session $s
Windows 8/Windows Server 2012以上の場合~PSSessionを使う
PSセッションを新規作成し、Invoke-Command コマンドレットを使ってタスクを実行します。
#セッションを新規作成
$s = New-PSSession -ComputerName <サーバー名> -Credential <ドメイン名\ユーザー名>
#タスク名を確認
Invoke-Command -Session $s -ScriptBlock{Get-ScheduledTask}
#タスク実行
Invoke-Command -Session $s -ScriptBlock{Get-ScheduledTask -TaskName "<タスク名>" | Start-ScheduledTask} -AsJob
#タスクの実行状態を確認
Get-Job -Id X
#ジョブを削除
Remove-Job -Id X
#セッションを破棄
Remove-PSSession -Session $s
Windows 8/Windows Server 2012以上の場合~CIMSessionを使う
CIMセッションを新規作成し、Start-ScheduledTask コマンドレットを使ってタスクを実行します。
#セッションを新規作成
$c = New-CimSession -ComputerName <サーバー名> -Credential <ドメイン名\ユーザー名>
#タスク名を確認
Get-ScheduledTask -CimSession $c
#タスク実行
Get-ScheduledTask -CimSession $c -TaskName "<タスク名>" | Start-ScheduledTask -AsJob
#タスクの実行状態を確認
Get-Job -Id X
#ジョブを削除
Remove-Job -Id X
#セッションを破棄
Remove-CimSession -CimSession $c
余談:まだまだ知らない事ばかり・・・
Technet ライブラリ「サーバー マネージャーでのリモート管理の構成」を読んで初めて知った事がいくつかあったので、こちらもメモしておきます。
まだまだ知らない事ばかりですね。。。
  1. ビルトイン Administrator アカウント以外のローカル Administrator グループのアカウントでサーバーをリモートで管理できるようにするには、リモート ユーザー アカウント制御 (UAC) の LocalAccountTokenFilterPolicy レジストリ設定を構成する必要がある
  2. Windows Server 2012 のサーバー マネージャーは、リモート接続に WinRM と分散コンポーネント オブジェクト モデル (DCOM) を使用する。
    Windows Server 2008 および Windows Server 2008 R2 を実行しても、Windows Management Framework 3.0 の更新プログラムが適用されていないサーバーとの通信には DCOM を使用する
参考にしたサイト