none
New-ScheduledTaskSettingsSetで[タスクを開始するまでのコンピューターのアイドル時間]にチェックを入れる方法

    質問

  • Windows Server 2012R2のサーバーでタスクスケジューラをPowerShellで登録することを試みています。

    条件タブのアイドル設定を操作するためにテストでtechnetに載っていた以下のコマンドを実行しました。

    $Sta = New-ScheduledTaskAction -Execute "Cmd"
    $Stset = New-ScheduledTaskSettingsSet -RunOnlyIfIdle -IdleDuration 00:02:00 -IdleWaitTimeout 02:30:00
    
    Register-ScheduledTask task01 -Action $Sta -Settings $Stset

    結果、タスクは登録され、IdleDurationとIdleWaitTimeoutに指定した時間の登録もされたのですが、

    [タスクを開始するまでのコンピューターのアイドル時間]の有効化が出来ていませんでした。

    -RunOnlyIfIdleを指定することでアイドル条件を有効化できるという理解だったのですが、

    この理解が間違っており別のパラメーターを指定する必要があるのでしょうか?



    2018年1月24日 9:10

回答

  • 当方のWindows Server 2012 R2で実行したところ、「次の間アイドル状態の場合のみタスクを開始する」にチェックが入りませんでした。

    Windows 10やWindows Server 2016ではチェックが入りますので、2012 R2にはバグがあるようですね。

    • 回答としてマーク iryu 2018年1月25日 2:31
    2018年1月25日 0:46
    モデレータ
  • こんにちは。

    牟田口さんのおしゃる様にWindows 2012 R2ではバグっている様です。

    こちらのブログにも同様の事例が載っており、

    $Sta = New-ScheduledTaskAction -Execute "Cmd"
    $Stset = New-ScheduledTaskSettingsSet -RunOnlyIfIdle -IdleDuration 00:02:00 -IdleWaitTimeout 02:30:00
    $Sttrg = (Get-CimClass -ClassName 'MSFT_TaskIdleTrigger' -Namespace 'Root/Microsoft/Windows/TaskScheduler')
    Register-ScheduledTask task01 -Action $Sta -Settings $Stset -Trigger $Sttrg


    の様に

    $Sttrg = (Get-CimClass -ClassName 'MSFT_TaskIdleTrigger' -Namespace 'Root/Microsoft/Windows/TaskScheduler')


    のトリガーを挟むことで不具合を回避できる様です。

    <del>手元の環境ではこれで上手く動作しました。</del>

    すいません。この手順でタスクにトリガーはつけることが出来ているのですが、最初の要求にある

    [タスクを開始するまでのコンピューターのアイドル時間]の有効化

    ができていませんでした。(GUI上チェックが付かない...)

    コマンドレットを使わずにschtasksを使うのが手っ取り早い回避策な気がします。

    # XMLに記述したタスク情報を登録
    schtasks /Create /TN task01 /XML .\idle-task.xml

    idle-task.xml例

    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <RegistrationInfo>
        <Author>Administrator</Author>
      </RegistrationInfo>
      <Triggers>
        <IdleTrigger>
          <Enabled>true</Enabled>
        </IdleTrigger>
      </Triggers>
      <Principals>
        <Principal id="Author">
          <UserId>Administrator</UserId>
          <LogonType>InteractiveToken</LogonType>
          <RunLevel>LeastPrivilege</RunLevel>
        </Principal>
      </Principals>
      <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>false</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <Duration>PT2M</Duration>
          <WaitTimeout>PT2H30M</WaitTimeout>
          <StopOnIdleEnd>true</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>true</RunOnlyIfIdle>
        <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
        <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
      <Actions Context="Author">
        <Exec>
          <Command>Cmd</Command>
        </Exec>
      </Actions>
    </Task>
    xmlファイルはGUIからエクスポートすると楽に作れますので環境に応じて直してください。


    • 編集済み stknohg 2018年1月25日 1:27 検証内容が正しくなかった。
    • 回答としてマーク iryu 2018年1月25日 2:31
    2018年1月25日 1:06

すべての返信

  • 当方のWindows Server 2012 R2で実行したところ、「次の間アイドル状態の場合のみタスクを開始する」にチェックが入りませんでした。

    Windows 10やWindows Server 2016ではチェックが入りますので、2012 R2にはバグがあるようですね。

    • 回答としてマーク iryu 2018年1月25日 2:31
    2018年1月25日 0:46
    モデレータ
  • こんにちは。

    牟田口さんのおしゃる様にWindows 2012 R2ではバグっている様です。

    こちらのブログにも同様の事例が載っており、

    $Sta = New-ScheduledTaskAction -Execute "Cmd"
    $Stset = New-ScheduledTaskSettingsSet -RunOnlyIfIdle -IdleDuration 00:02:00 -IdleWaitTimeout 02:30:00
    $Sttrg = (Get-CimClass -ClassName 'MSFT_TaskIdleTrigger' -Namespace 'Root/Microsoft/Windows/TaskScheduler')
    Register-ScheduledTask task01 -Action $Sta -Settings $Stset -Trigger $Sttrg


    の様に

    $Sttrg = (Get-CimClass -ClassName 'MSFT_TaskIdleTrigger' -Namespace 'Root/Microsoft/Windows/TaskScheduler')


    のトリガーを挟むことで不具合を回避できる様です。

    <del>手元の環境ではこれで上手く動作しました。</del>

    すいません。この手順でタスクにトリガーはつけることが出来ているのですが、最初の要求にある

    [タスクを開始するまでのコンピューターのアイドル時間]の有効化

    ができていませんでした。(GUI上チェックが付かない...)

    コマンドレットを使わずにschtasksを使うのが手っ取り早い回避策な気がします。

    # XMLに記述したタスク情報を登録
    schtasks /Create /TN task01 /XML .\idle-task.xml

    idle-task.xml例

    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <RegistrationInfo>
        <Author>Administrator</Author>
      </RegistrationInfo>
      <Triggers>
        <IdleTrigger>
          <Enabled>true</Enabled>
        </IdleTrigger>
      </Triggers>
      <Principals>
        <Principal id="Author">
          <UserId>Administrator</UserId>
          <LogonType>InteractiveToken</LogonType>
          <RunLevel>LeastPrivilege</RunLevel>
        </Principal>
      </Principals>
      <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>false</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <Duration>PT2M</Duration>
          <WaitTimeout>PT2H30M</WaitTimeout>
          <StopOnIdleEnd>true</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>true</RunOnlyIfIdle>
        <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
        <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
      <Actions Context="Author">
        <Exec>
          <Command>Cmd</Command>
        </Exec>
      </Actions>
    </Task>
    xmlファイルはGUIからエクスポートすると楽に作れますので環境に応じて直してください。


    • 編集済み stknohg 2018年1月25日 1:27 検証内容が正しくなかった。
    • 回答としてマーク iryu 2018年1月25日 2:31
    2018年1月25日 1:06
  • 牟田口様

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

    他のサーバやWindows8の端末でもチェックが入らなかったのでバグを疑っておりましたが、

    バグを明言した記事などもなく判断しかねていました。

    Windows10や2016ではチェックが入るとの情報も大変助かります。

    2018年1月25日 2:21
  • stknohg様

    ご回答頂きありがとうございました。

    New-ScheduledTaskSettingSetで簡単に登録とはいかない、ということが分かっただけでも大変助かりました。

    ご紹介頂いたschtasksのコマンドで当方の環境でも期待通りの登録ができましたので、

    schtasksを使うかGUIの操作で逃げるかは検討したいと思います。

    2018年1月25日 2:31