locked
Windows 7 SP1 (32bit/64bit)の自動デフラグ をリモートから一括で無効化する方法について RRS feed

  • 質問

  • こんにちは。

    社内で利用している700台のVDIにおいて、デフォルトで毎週水曜日の1:00に設定されているディスク最適化のスケジュールを無効化をしたいと考えています。
    対応者が私一人しかおらず、VDIは基本的に社員の皆さんが利用しているので、バックグラウンドから一括で無効化する方法が無いか探しています。
    (1台ずつ管理者でログオンして、デフラグのGUIを起動してスケジュールを無効化するのは状況的に厳しいと思っています)

    タスクスケジューラーに「ScheduledDefrag」というのが有り、こちらを手動またはコマンドラインから無効化すると、後日手動でデフラグをしようとGUIを開こうとすると「ディスク デフラグ ツールは他のプログラムを使ってスケジュールされました」と出てきてしまうのですが、この状況で問題が無いのかが木になっています。
    (このタスクは、デフラグのGUI画面から無効化しても、タスクは無効化されていませんでした。でも、自動でデフラグは行われなかったので、GUIから設定した場合の本来の設定とは異なるようなので、タスクを無理やり無効化するのはいかがなものかとも懸念しております)

    コマンドプロンプトやPowerShell、VBScriptなどでディスク最適化のスケジューリングを無効化にする方法ってあるのでしょうか?
    それとも、上記のタスクの無効化をするしか方法が無いのでしょうか?
    (その場合、その対応は問題ないものなのでしょうか?)

    ご存知の方いらっしゃいましたら、ご教示いただけると幸いです。
    宜しくお願いいたします。

    2016年11月17日 5:29

回答

  • デフラグをGUIからチェックを外すと無効になるのは、タスクではなく、タスクのトリガーだと思います。
    個人的にはタスクを無効化しても問題無いと思いますが、以下の様な感じでトリガーを無効に出来ると思います。

    $targetComputer = $env:COMPUTERNAME
    $taskScheduler = New-Object -COMObject Schedule.Service
    $taskScheduler.Connect($targetComputer)
    $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag")
    $task = $taskFolder.GetTask("ScheduledDefrag")
    
    #既存のタスクの定義を取得してトリガを無効に変更
    $newDef = $task.Definition
    $newDef.Triggers.Item(1).Enabled = $false
    
    #変更した定義でタスクを更新
    $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)

    APIについては以下URLを参照して下さい。
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa383606.aspx



    • 回答としてマーク どらちん 2016年11月18日 8:51
    • 編集済み LazyDogg 2020年7月30日 7:47 カンマ抜け修正
    2016年11月17日 9:21

すべての返信

  • 個別にディスク最適化(デフラグ)だけ無効にする設定ではないのですが、グループポリシーで以下を構成すればデフラグを含む自動メンテナンスが無効になります。

    コンピューターの構成
     ⇒管理用テンプレート→システム
      ⇒トラブルシューティングと診断
       ⇒スケジュールされたメンテナンス動作の構成
    「無効」に構成


    hebikuzure

    2016年11月17日 6:05
  • hebikuzure さん

    早速のご回答、有難うございます。
    「個別にディスク最適化(デフラグ)だけ無効にする設定ではないのですが」と有りますが、具体的にデフラグ以外に何が無効化されるかご存知でしょうか?

    もし、影響が無いレベルなのであれば、ADからポリシーで展開してもらうのも候補とそて上げられそうなので・・・

    お手数をおかけしますが、ご存知でしたらご教示いただけますでしょうか?

    2016年11月17日 8:11
  • デフラグをGUIからチェックを外すと無効になるのは、タスクではなく、タスクのトリガーだと思います。
    個人的にはタスクを無効化しても問題無いと思いますが、以下の様な感じでトリガーを無効に出来ると思います。

    $targetComputer = $env:COMPUTERNAME
    $taskScheduler = New-Object -COMObject Schedule.Service
    $taskScheduler.Connect($targetComputer)
    $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag")
    $task = $taskFolder.GetTask("ScheduledDefrag")
    
    #既存のタスクの定義を取得してトリガを無効に変更
    $newDef = $task.Definition
    $newDef.Triggers.Item(1).Enabled = $false
    
    #変更した定義でタスクを更新
    $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)

    APIについては以下URLを参照して下さい。
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa383606.aspx



    • 回答としてマーク どらちん 2016年11月18日 8:51
    • 編集済み LazyDogg 2020年7月30日 7:47 カンマ抜け修正
    2016年11月17日 9:21
  • 自分で調べたわけではないですが、調べた人が居るので参考にしてください。


    hebikuzure

    2016年11月18日 6:55
  • LazyDoggさん

    有難うございます!
    いただいたPowerShellのコードを参考に、引数が有れば第一引数を対象ホストとして、無ければローカルホストを対象とする形にアレンジして、思ったとおりの動きになりそうでした!

    #引数を確認
    if ($Args[0] -eq "" -or $Args[0] -eq $null)
    {
        #引数が無かったらローカルホストを対象にする
        $strComputerName = "localhost"
    }
    else
    {
        #引数が有れば、第一引数をターゲットのホスト名とする
        $strComputerName = $Args[0]
    }
    
    #Schedule.Service オブジェクトを作成
    $taskScheduler = New-Object -COMObject("Schedule.Service")
    
    #ターゲットホストのSchedule.Serviceに接続
    $taskScheduler.Connect($strComputerName)
    
    #スケジュールされたデフラグのタスクを取得
    $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag")
    $task = $taskFolder.GetTask("ScheduledDefrag")
    
    #変更する設定内容を作成
    $newDef = $task.Definition
    $newDef.Triggers.Item(1).Enabled = $false
    
    #タスクを設定
    $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)

    有難うございました!
    大変参考になりました。

    2016年11月18日 8:50
  • hebikuzureさん

    有難うございます。
    他の項目をとめたときの影響が見えなかったので、今回はPowerShellでタスクのトリガーを無効化する方法をとらせていただきました。

    2016年11月18日 8:53