none
タスクスケジューラでログインしていないときにPowerShellが実行されない

    質問

  • 環境

    Azure:Basic_A1

    OS:WindowsServer2016

    PowerShellのスクリプトをタスクスケジューラに登録したところ、タスクスケジューラ上で手動で実行したり、ユーザがログイン中はスクリプトが実行されるのですが、ログオフ中にスクリプトが実行されません。

    タスクスケジューラの履歴的には正常終了していることになっています。

    PowerShellのスクリプトは以下の2種類です。

    1.AzureのVPNgatewayのステータスをイベントログに書き込む

    2.Robocopyを行い、Robpcopy実行結果をイベントログに書き込む

    ※手元にスクリプトがないので取り急ぎ概要のみ記載させていただきます。また、1,2とも対話的な操作は行いません。

    1.は毎回スクリプトが実行されないわけではなく、たまに書き込みが行われています。8月1日頃に10分間隔で実行するように設定し、1~2日に1回程度書き込まれています。

    2のRobocopyは、イベントログへの書き込み以前にRobocopy自体が行われていない状況です。8月9日頃に設定を行い、今のところイベントログへの書き込みは確認できていません

    実際のスクリプトを見ないとご回答出来ないかもしれませんが、ログオフ中に実行されない原因はどのようなことが考えられますでしょうか。


    • 編集済み saito.k 2017年8月13日 7:11
    2017年8月13日 7:11

回答

  • 牟田口様

    ご回答ありがとうございます。

    当方でも調べを進めたところ以下の記事が見つかりました。

    https://social.technet.microsoft.com/Forums/ja-JP/61a35c0c-0099-40c0-ac33-4ea2a1f41651/batchpowershell?forum=windowsserver2008ja

    こちらを参考に、操作を以下のように変更したところログオフ中もPowerShellスクリプトが実行されるようになりました。

    操作:プログラムの開始
    設定:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

    引数の追加:-file "C:\work\VPN_connchk.ps1"

    開始:C:\work

    牟田口様の方でもご推察のとおり、単純にpowershell -File "C:\work\VPN_connchk.ps1"と設定すればよかったようです。

    ただ、まだ1、2回くらいしか確認できていないので、一晩様子を見たいと思います。
    2017年8月14日 12:11

すべての返信

  • 「ユーザーがログオンしているかどうかにかかわらず実行する」オプションにチェックは入っていますか?

    また、Windows Server 2016 / Windows 10の最新バージョンのタスクスケジューラには、トリガーを「毎日」にし、「繰り返し間隔」を指定した場合、正しくタスクが実行されないというバグ(仕様?)があります。

    トリガーを「1回」、「継続時間」を「無限」にした上で、「繰り返し間隔」を指定してみてください。

    Robocopyが動かないのはファイルアクセス権のチェックが必要です。タスクスケジューラを実行するアカウントが、対象ファイルを読み書き可能であるかを確認してみてください。

    2017年8月13日 8:34
    モデレータ
  • 私もこの状況に嵌って困ったことがあります。タスクスケジューラーでタスクの履歴を有効にしてみてください。タスクを実行しなかった理由が記録されるようになりますので、原因がわかります。

    私の場合、タスクにパスワードが保存されていなかったために非ログオン中は実行できない旨のエラーが記録されていました。SYSTEM権限での動作でも支障がない場合は

    Set-ScheduledTask -TaskName タスク名 -Principal (New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount)

    と設定してやることで動作するようになりました。ScheduledJobで作成したタスクの場合は \Microsoft\Windows\Powershell\ScheduledJobs にありますので上記コマンドレットに-TaskPathを追加することで同様に指定できます。

    2017年8月13日 9:35
  • 牟田口様
    佐祐理様

    ご回答ありがとうございます。

    質問時の情報が不足しており、申し訳ございません。

    「ユーザーがログオンしているかどうかにかかわらず実行する」オプションにチェックが入っています。
    「最上位の特権で実行する」オプションにチェックが入っています。
    PowerShellのスクリプトは、バッチファイルから実行するようにしております。
      VPNチェックスクリプトを実行するバッチ(VPNCheck.bat)(※一例としてVPNチェックスクリプトを実行するバッチを載せておりますが、Robocopyを実行するPowerShellスクリプトも同様にバッチから実行しております。)

    @powershell -Command "Start-Process powershell.exe -ArgumentList "C:\work\VPN_connchk.ps1" -Verb runas"

    PowerShellスクリプトを実行しないタスクも幾つか登録しており、それらは問題なく実行されています。
    タスクの履歴は有効にしております。

    タスクの履歴(ユーザ名をマスクしています)
    タスク スケジューラは、時間による起動条件で、タスク "\VPNCheck" の "{fd3febcd-9901-4456-bc26-96579fbdcaf5}" インスタンスを起動しました。
    タスク スケジューラは、プロセス ID 7188 でタスク "\VPNCheck"、インスタンス "C:\Windows\SYSTEM32\cmd.exe" を起動しました。
    タスク スケジューラは、ユーザー "user" の "\VPNCheck" タスクの "{fd3febcd-9901-4456-bc26-96579fbdcaf5}" インスタンスを開始しました。
    タスク スケジューラは、タスク "\VPNCheck" のインスタンス "{fd3febcd-9901-4456-bc26-96579fbdcaf5}" で操作 "C:\Windows\SYSTEM32\cmd.exe" を開始しました。
    タスク スケジューラは、タスク "\VPNCheck"、インスタンス "{fd3febcd-9901-4456-bc26-96579fbdcaf5}"、操作 "C:\Windows\SYSTEM32\cmd.exe" を正常に完了しました。リターン コード: 0
    タスク スケジューラは、ユーザー "user" の "\VPNCheck" タスクの "{fd3febcd-9901-4456-bc26-96579fbdcaf5}" インスタンスを正常に完了しました。

    特にエラーは出ておらず、タスクは正常に完了しております。

    ログオフ中は、タスクスケジューラのタスクは正常に完了しているけれども、PowerShellのスクリプトが実行されていない状況でございます。
    ※ログイン中はPowerShellスクリプトが実行されて、イベントログに書き込みが行われています。

    トリガーを「1回」、「継続時間」を「無限」にし、「繰り返し間隔」を指定してみたのですが、状況は変わりませんでした。

    「操作」の設定はPowerShellスクリプトを実行実行するバッチフィルを設定しております。
    操作:プログラムの開始
    設定:C:\work\VPNCheck.bat
       "引数の追加","開始"は空欄です。

    -------

    その他当方で確認したこととして、

    OSにログイン中はPowerShellが実行されている。
    PowerShellのスクリプトがどこまで実行されたかわかるように、何箇所かテキストにログを書き出すように仕込んだけれども、ログオフ中はテキストログ自体が出力されなかった。

    以上のことから、バッチがPowerShellの実行に失敗しているのではないかと推測しております。

    バッチファイルの作りの問題か、タスクスケジューラの設定の仕方の問題か、アドバイス頂きたくお願い申し上げます。

     

    • 編集済み saito.k 2017年8月14日 9:54
    2017年8月14日 9:52
  • @powershell -Command "Start-Process powershell.exe -ArgumentList "C:\work\VPN_connchk.ps1" -Verb runas -Wait"

    のようにして、Start-Processで起動したスクリプトの終了を待機してみるとどうでしょうか?

    そもそも、bat自体をタスクスケジューラで管理者権限で実行しているので、Start-Processを使ってrunasする必要はないような気もします。

    単純に、

    @powershell -File "C:\work\VPN_connchk.ps1"

    ではダメでしょうか?

    あと気になるのはスクリプト実行のExecutionPolicyです。上記でダメな場合は更に以下をお試し下さい。

    @powershell -File "C:\work\VPN_connchk.ps1" -ExecutionPolicy Bypass

    2017年8月14日 11:19
    モデレータ
  • 補足ですが、それでも動作しない場合、

    @powershell -File "C:\work\VPN_connchk.ps1" -ExecutionPolicy Bypass > C:\work\log.txt

    のようにして、powershellの実行結果をファイルに記録してみるのも手だと思います。もしps1の実行中に何かエラーが出ていた場合、log.txtに内容が書き出されていると思います。

    2017年8月14日 11:36
    モデレータ
  • 牟田口様

    ご回答ありがとうございます。

    当方でも調べを進めたところ以下の記事が見つかりました。

    https://social.technet.microsoft.com/Forums/ja-JP/61a35c0c-0099-40c0-ac33-4ea2a1f41651/batchpowershell?forum=windowsserver2008ja

    こちらを参考に、操作を以下のように変更したところログオフ中もPowerShellスクリプトが実行されるようになりました。

    操作:プログラムの開始
    設定:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

    引数の追加:-file "C:\work\VPN_connchk.ps1"

    開始:C:\work

    牟田口様の方でもご推察のとおり、単純にpowershell -File "C:\work\VPN_connchk.ps1"と設定すればよかったようです。

    ただ、まだ1、2回くらいしか確認できていないので、一晩様子を見たいと思います。
    2017年8月14日 12:11
  • 牟田口様
    佐祐理様

    上述の設定で、ログオフ中もタスクが実行されていることが確認できました。

    > 操作:プログラムの開始
    > 設定:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    > 引数の追加:-file "C:\work\VPN_connchk.ps1"
    > 開始:C:\work

    ご助言頂きまして、誠にありがとうございます。

    2017年8月15日 2:20